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标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。