对比下面的例子:前端
var multiply = new Function('x', 'y', 'return x * y');
复制代码
function multiply(x, y) {
return x * y;
} // 没有分号
复制代码
var multiply = function(x, y) {
return x * y;
};
复制代码
var multiply = function func_name(x, y) {
return x * y;
};
复制代码
var y = function x() {};
alert(x); // throws an error
复制代码
// 函数声明
foo() // foo
function foo() {
return 'foo'
}
// 函数表达式
foo2() // foo2 is not a function
var foo2 = function(){
return 'foo2'
}
// Function 构造函数
foo3() // foo3 is not a function
var foo3 = new Function('return "foo3"')
复制代码
函数表达式定义的函数继承了当前的做用域。换言之,函数构成了闭包。另外一方面,Function构造函数定义的函数不继承任何全局做用域之外的做用域(那些全部函数都继承的)。bash
经过函数表达式定义的函数和经过函数声明定义的函数只会被解析一次,而Function构造函数定义的函数却不一样。闭包
注意在经过解析Function构造函数字符串产生的函数里,内嵌的函数表达式和函数声明不会被重复解析。例如:ide
var foo = (new Function("var bar = \'FOO!\';\nreturn(function() {\n\talert(bar);\n});"))();
foo(); // 函数体字符串"function() {\n\talert(bar);\n}"的这一部分不会被重复解析。
复制代码
// 函数表达式
var foo = function(){}
var bar = function bar(){}
(function bar2() {})
复制代码
var x = 0; // source element
if (x === 0) { // source element
x = 10; // 非source element
function boo() {} // 非 source element 函数表达式
}
function foo() { // source element 函数声明
var y = 20; // source element
function bar() {} // source element 函数声明
while (y === 10) { // source element
function blah() {} // 非 source element 函数表达式
y++; //非source element
}
}
复制代码
若有侵权,请发邮箱至wk_daxiangmubu@163.com 或留言,本人会在第一时间与您联系,谢谢!! 函数