JS -函数及其作用域

2017-01-03  本文已影响42人  饥人谷_阿靖

1、函数声明和函数表达式有什么区别

 function functionName(){};  //函数声明:使用function关键字声明一个函数
 var functionName = function(){};   //函数表达式
区别:
函数声明必须有函数名,函数调用可以放在任何位置(函数的声明前  置)。
函数表达式的函数名可以省略(但不能被外部直接引用),函数调用只有在函数表达式声明后才能使用。

2、什么是变量的声明前置?什么是函数的声明前置

如果存在变量声明和函数声明,那么它们都会被提到外部作用域的开头,其中变量声明不被赋值,函数声明不会执行。
如果变量声明和函数声明是同名的,那么函数的优先级更高,所以变量会被函数覆盖掉。如果变量声明的同时被赋值那么变量优先级高于函数。

var fn;
function fn() {}
console.log(fn); //function fn() {}

var fn=1;
function fn () {};
console.log(fn); //1

3、arguments 是什么

arguments是一个类数组对象, 存储了该函数的在执行时的所有传入参数, 只有length属性, 可以用arguments访问参数, 检测函数的参数个数, 也可用于模拟函数重载.

4、函数的重载怎样实现

js中并没有函数重载的概念,如果声明了两个同名函数,结果是后面的函数覆盖了前面的函数。
function sum(a,b){
     var sum=0;
     sum=a+b;
     return sum;

}

 function sum(a,b,c){
     var sum=0;
     sum=a+b+c;
     return sum;
 }
console.log(sum(1,2));//NaN
console.log(sum(1,2,3));//6

实现函数重载效果,可以通过arguments对象实现:
function sum(){
var sum =0;
for(var i=0;i<arguments.length;i++){
    sum =sum+arguments[i];
}
return sum;
}
console.log(sum(1,2));  //3
console.log(sum(1,2,3));  //6

5、立即执行函数表达式是什么?有什么作用

立即执行函数表达式,两种形式:
(function (){})();
(function (){}());
作用:
1、模拟块作用域, JS没有块作用域(block),只有函数作用域,在同时调用多个库的情况下,很容易造成对象或者变量的覆盖, 使用立即执行函数可以创建独立的作用域, 不互相影响。
2、解决闭包冲突
3、模拟单例

var a=1;
(function (){ console.log(a); })(); //立即执行函数表达式

var b=function () //函数表达式
 { console.log(a); }
 ();

 function c() //函数声明
 { console.log(a); }
 c();

 function fn() {  
      var x = 1;  
      if (x) {  
    (function () {  
        var x = 2;  
        console.log(x); //x is 2
    }());  
}  
console.log(x); //x is still 1

}

6、什么是函数的作用域链

  在JS中,变量的作用域有全局作用域和局部作用域两种:
  在代码中任何地方都能访问到的对象拥有全局作用域;
  局部作用域一般只在固定的代码片段内可访问, 最常见的例如函数内部。

  在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。   函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。
上一篇 下一篇

猜你喜欢

热点阅读