函数的作用域

一、函数的作用域

在函数 内部定义的变量,只能在函数的内部声明。

作用域链(自身—父级—上级)

例1(无形参)

 
 
 
 
 
var a=10;
function fn(){
   a=20;
}
console.log(a);
fn();
console.log(a);
 

例2(有形参)

 
 
 
 
 
var a=10;
function fn(a){
//var a=undefined;
   a=20; 
}
fn();
console.log(a);
//结果为10
 

例3

 
 
 
 
 
var a=10;                            //a=30;
var fn=function(){                   //向外层找a的声明,找到全局变量
  a=30;                              //a=30;
  var fn2()=function(a){             //系统声明var a   并将a赋值为30;
    console.log(a);                  //30
    a=40;
    console.log(a);                  //40
  }
  fn2(a);                           //a的值此时为30,然后调用fn2()函数
  console.log(a);                   //30
};
fn();
console.log(a);                      //30
//结果为30,40,30,30
 

补充:※※函数提升,把函数定义的时机,放在当前作用域的开头。(在 js中只有函数才产生作用域,而if,while,for其他语句,都不会产生作用域)

当2个函数处于同等级的情况下。

 
 
 
 
 
var a=1;
var fn1=function(){
  var a=10;
};
var fn2=function(){
  console.log(a);             //向外层找a的声明。跳过同等级的
};
fn1();
fn2();
//结果为1
 

变量提升:在声明变量时2,会把当前变量声明的时机放在当前作用域的开头。(只有变量的声明才有提升,变量的赋值没有提升)

 
 
 
 
 
console.log(a);
var a=10;    //等同于var a;   a=10;    其中var a;变量提升。
//结果为undefined
 

二、对象

一堆无先后顺序的数据的集合*(每个数据都要取名,即属性名)

属性名的命名规则,比较宽松。

 
 
 
 
 
var obj={
  name:'Bob',
  age:20,
  gender:'man',
  123:false,
  'test+test':'hello'
};
console.log(obj);
//输出结果为:object{name:'BOb',age:20,gender:'man',123:false,test+test:'hello'}
console.log(obj.name);    //第一种取值方式
//输出结果为:Bob
console.log(obj.age);     //第一种取值方式
//输出结果为:20
console.log(obj['name']);  //第二种取值方式,当属性名命名是比较宽松的命名方式时,采取。比如使用数字开头,或者属性名中间出现了一些符号。
console.log(obj['123']);   
//输出结果为:false
console.log(obj['test+test']);
//输出结果为:hello
 

取对象的2种方式:点和方括号——一般情况推荐使用点的方式(代码更紧凑)

区别:

1、点会把后面的名称直接作为属性名,而方括号会把返回值作为属性名。2、对于一些特殊的属性名,比如使用数字开头,或者属性名中间出现了一些符号。这些属性职能通过方括号的方式取。

用对象将数据中最大的,最小的都返回出来(将多项数据组合在一起输出)

 
 
 
 
 
function fn(a,b,c){
  var arr=[a,b,c];
  //使用冒泡法比较数组的大小
  for(var i=0,i<arr.length-1;i++){
    for(var j=0;j<arr.length-i-1;j++){
      if(arr[j]>arr[j+1]){
        //定义新的变量
        var tempt=arr[j];
        //交换位置
        arr[j]=arr[j+1];
        arr[j+1]=tempt;  
      }
    }  
  }
  var min=arr[0];
  var max=arr[2];
  //定义对象,将最大,最小值写入
  var obj={
    min=min,
    max=max
  };
  console.log(obj);
}
 

数组与对象的区别(数组有长度,并且长度会随着变化。而对象没有长度概念之说。)

通过new创建数组(缺点,比较麻烦,不够直观)

 
 
 
 
 
//第一种方式
var arr=new Array();
arr[0]=1;
arr[1]=2;
arr[2]=3;
console.log(arr);
//结果为:[1,2,3]
//第二种方式
var arr=new Array(5);
arr[0]=1;
arr[1]=2;
arr[2]=3;
arr[5]=6;
console.log(arr);
console.log(arr.length);
//结果为[1,2,3,5:6]
//6
//第三种方式
var arr=new Array(1,2,3);
console.log(arr);
console.log(arr.length);
//结果为[1,2,3]
//3
//第4种方式-数组字面量方式
var arr=[1,2,3]
//总结;如果没有特殊情况,建议使用第4种方式。
 

数组类型的方法

concat()方法:首尾连接作用

 
 
 
 
 
var arr=[1,2,3];
var arr2=[10,20];
var arr3=[30,40];
var result=arr.concat(arr2,arr3);
console.log(result);
//结果为:[1,2,3,10,20,30,40]
 

join()方法:将数组的每一项拼接到一起,结果为字符串

 
 
 
 
 
var arr=[1,2,3];
var result=arr.join();     //默认情况下为,号
console.log(result);
//结果为:1,2,3
var arr=[1,2,3];
var result=arr.join('');   //连在一起的情况
console.log(result);
//结果为:123
var arr=[1,2,3];
var result=arr.join(' ');   //中间有一个空格
console.log(result);
//结果为:1 2 3
var arr=[1,2,3];
var result=arr.join('+');    //中间的连接符号为+
console.log(result);
//结果为:1+2+3
 

pop()方法:删除最后一项,且返回值为最后一项。

 
 
 
 
 
var arr=[1,2,3,5];
var result=arr.pop();       //删除最后一项
console.log(result);        //返回值为最后一项
console.log(arr);
//输出结果为:5
//          [1,2,3]
 

push()方法:添加一项,并且将数组的长度改变。增加一项。也可以同时添加多项,并用,号隔开。

 
 
 
 
 
var arr=[1,2,3,5];
var result=arr.push('hello''js');    
console.log(result);    //返回值为新的数组的长度
console.log(arr);
//结果为:6
//      [1,2,3,5,'hello','js']
 

reverse()方法:将数组里面的数据颠倒顺序。并且原数组也会跟着变化

 
 
 
 
 
var arr=[1,2,3,4,5];
var result=arr.reverse();
console.log(arr);
console.log(result);
//结果为:[5,4,3,2,1]
//       [5,4,3,2,1]
 

shift()方法:删除并返回数组的第一个元素

 
 
 
 
 
var arr=[1,2,3,4,5];
var result=arr.shift();
console.log(arr);
console.log(result);
//结果为:[2,3,4,5]
//       [1]
 

slice()方法:截取数组的片段

 
 
 
 
 
var arr=[1,2,3,hello,4,5,js];
var result=arr.slice(3,6);  //注意结束取值,不包含end元素;当star或者end为负数时,则从右向左数。(负数的写法只能在slice中使用)
console.log(arr);
console.log(result);
//结果为:[1,2,3,hello,4,5,js]
//        [hello,4,5]
 

sort()对数组中的元素进行排序,(从小到大排序,注意,只能对首个字符进行排序)

 
 
 
 
 
var arr=[2,1,3,7,4];
arr.sort();
console.log(arr);
//结果为:[1,2,3,4,7]
var arr=[23,1,300,7,4];
//定义排序规则的函数
function rule(a,b){
  if(a<b){
    //如果要让a出现在b之前,返回小于0的数
    return -1
  }else{
    return 1;
  }
  //可以将以上的if语句  写为  return a-b;
}
arr.sort(rule);
console.log(arr);
//结果为:[1,4,7,23,300]
 

splice()删除元素,并向元素添加新的项目,返回值为被删除的项(用于删除中间的项目)

 
 
 
 
 
//删除作用
var arr=[23,1,300,7,4];
var result=arr.splice(2,1);   //()前面那个代表被删除的项处于的某一项,后面那个为需要删除多少项,返回值为被删除的内容。
console.log(arr);
console.log(result);
//结果为:[23,1,7,4]
//       [300,7]
//替换作用
var arr=[23,1,300,7,4];
var result=arr.splice(2,1,100,200);   //添加的个数不限
console.log(arr);
//结果为:[23,1,100,200,7,4]
//插入功能
var arr=[23,1,300,7,4];
var result=arr.splice(3,0,100,200);   //替换的内容为()中定义的第一个数字的的位置
console.log(arr);
//结果为:[23,1,300,100,200,7,4]
 
原文地址:https://www.cnblogs.com/cswzl/p/5990457.html