函数声明和函数表达式有什么区别
function foo(){} 函数声明
var f = function foo(){}; 函数表达式
new function foo(){}; 函数表达式,因为它是NewExpression表达式
(function (){
function foo(){}; 函数声明,是函数体的一部分
}) ();
(function foo(){}); 函数表达式,因为它被包含在分组操作符中,分组操作符只能包含表达式
简单来说,如果function foo(){}作为赋值表达式的一部分,则其为函数表达式,如果function foo(){}被包含在函数体内,或者处于程序的最上层,则认为它是函数声明。
两者的异同:
函数声明会在任何表达式被解析和求值之前先被解析求值;而表达式是遇到再算。
什么是变量的声明前置?什么是函数的声明前置
变量的声明前置就是无论变量的声明在程序什么位置出现,都将它置于初始的位置。
函数声明前置是指将函数的声明置于初始位置,但是在变量声明之后。
上述代码执行后会出现function和1,因为实际相当于
arguments 是什么
arguments是函数的参数集合,用于获取参数数组,也可用于函数重载。
函数的重载怎样实现
function sum(a,b,c){
var sum =0;
for (var i =0; i<arguments.length; i++){
sum += arguments[i];
}
return sum;
}
上述函数是一个重载的求和函数。
立即执行函数表达式是什么?有什么作用
(function sum(){})();
(function(){})(); 匿名函数
可以让函数在定义后直接调用,作用是在固有的作用域内使用,不会污染全局变量
什么是函数的作用域链
全局作用域,就是在函数外声明或者在函数内部未加var的变量都存在与全局作用域。
局部作用域,就是在函数内部可以访问到的作用域。
作用域链就是函数在使用过程中,会查找相应的变量或函数声明,首先是在当前作用域查找,之后开始逐级向上查找,这就形成了作用域链。
代码
1.
2.
3.因为变量声明前置,所以a是未定义,而b没有声明,所以报错
4.实际的执行顺序如下,所以输出helloworld和sayAge未声明
5.
实际执行路线
6.因为实际的执行顺序是
7.因为fn是1不是函数所以报错
8.因为声明前置,所以前两项未初始化,后两项循环后得10,100,这里有个问题,i,j的变量声明不是在for循环里面的吗,应该是局部变量才对呀,所以如果是局部变量的话,是不是前两个应该报错才对?是因为语句写的变量(不在函数内)所以都是全局变量吗?
9.实际顺序如下
10.函数输出10-2,运行后销毁,之后输出0
版权归ENVY和饥人谷所有,转载请注明出处