1.var
// 反例
myname = "global"; // 全局變量
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
JavaScript中,你可以在函數的任何位置聲明多個var語句,并且它們就好像是在函數頂部聲明一樣發揮作用,這種行為稱為 hoisting(懸置/置頂解析/預解析)。
Function
console.log(fun);
var fun=function () {
var a = "aa";
var b = "bb";
}
console.log(fun);
結果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yMxATNjJ2YlNGZ1cTY2YDM4kDMlJGMyIGN0YTOxEGOz8CX0EzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL5M3Lc9CX6MHc0RHaiojIsJye.png)
可以看出方法的申明就跟上面不一樣,感覺function fun就是一個整體。
2)全局變量與隐式全局變量差别:
- 通過var建立的全局變量(任何函數之外的程式中建立)是不能被删除的。
- 無var建立的隐式全局變量(無視是否在函數中建立)是能被删除的。
這表明,在技術上,隐式全局變量并不是真正的全局變量,但它們是全局對象的屬性。屬性是可以通過
delete
操作符删除的,而變量是不能的:
// 定義三個全局變量
var global_var = 1;
global_novar = 2; // 反面教材
(function () {
global_fromfunc = 3; // 反面教材
}());
// 試圖删除
delete global_var; // false
delete global_novar; // true
delete global_fromfunc; // true
// 測試該删除
typeof global_var; // "number"
typeof global_novar; // "undefined"
typeof global_fromfunc; // "undefined"
2.eval Function
Function可以替代eval執行字元串的腳本
console.log(typeof un); // "undefined"
console.log(typeof deux); // "undefined"
console.log(typeof trois); // "undefined"
var jsstring = "var un = 1; console.log(un);";
eval(jsstring); // logs "1"
jsstring = "var deux = 2; console.log(deux);";
new Function(jsstring)(); // logs "2"
jsstring = "var trois = 3; console.log(trois);";
(function () {
eval(jsstring);
}()); // logs "3"
console.log(typeof un); // number
console.log(typeof deux); // "undefined"
console.log(typeof trois); // "undefined"
eval()和Function構造不同的是eval()可以幹擾作用域鍊,而Function()更安分守己些。不管你在哪裡執行 Function(),它隻看到全局作用域。
由上面可以看出,Function隻調用全局作用域 (自己内部變量當然可以)
3.return {}
// 警告: 意外的傳回值
function func() {
return
// 下面代碼不執行
{
name : "Batman"
}
}
由于隐含分号,函數傳回undefined。前面的代碼等價于:
// 警告: 意外的傳回值
function func() {
return undefined;
// 下面代碼不執行
{
name : "Batman"
}
}
正确方式:
function func() {
return {
name : "Batman"
};
}
帶return的function執行個體化和方法調用
由上面可以看出
fun執行個體化後是一個有name屬性的對象
fun調用後傳回的是一個字元串
沒有return 的function調用傳回的是一個undefined
4.自執行
函數聲明:
函數表達式:
(function(){...}()) //函數表達式:注意它被包含在分組操作符‘()’中,分組操作符隻能包含表達式
(function(){...})();
var abc=/+/new/!/-/&&/~ function(){...}();