天天看點

js 注意點

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);      

結果:

js 注意點
js 注意點

 可以看出方法的申明就跟上面不一樣,感覺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執行個體化和方法調用

js 注意點

由上面可以看出

fun執行個體化後是一個有name屬性的對象

fun調用後傳回的是一個字元串

沒有return 的function調用傳回的是一個undefined

4.自執行

js 注意點

函數聲明:

函數表達式:

(function(){...}())   //函數表達式:注意它被包含在分組操作符‘()’中,分組操作符隻能包含表達式

(function(){...})();

var abc=/+/new/!/-/&&/~ function(){...}();

js 注意點

繼續閱讀