對比下面的例子:前端
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 或留言,本人會在第一時間與您聯繫,謝謝!! 函數