var a = 2;
引擎認爲這裏有兩個徹底不一樣的聲明, 一個由編譯器在編譯時處理, 另外一個則由引擎在運行時處理new Function(..)
函數的行爲也很相似, 最後一個參數能夠接受代碼字符串,並將其轉化爲動態生成的函數(function foo(){ .. })
做爲函數表達式意味着 foo
只能在 ..
所表明的位置中被訪問,外部做用域則不行{ .. }
內部)var a=2;
JavaScript實際上會將其當作兩個聲明。var a;
和a=2;
第一個定義聲明是在編譯階段進行的,第二個賦值會留在原地等待執行階段for/let
行爲指出變量在循環過程當中不止被聲明一次,每次迭代都會聲明一、var bar = obj.foo; bar();
//會應用默認綁定;二、doFoo(obj.foo);
//函數做爲參數傳遞,隱式賦值;三、setTimeout(obj.foo, 100);
//函數傳入語言內置函數,一樣bind(..)
的功能之一就是能夠把除了第一個參數(第一個參數用於綁定 this)以外的其餘參數都傳給下層的函數(這種技術稱爲「部分應用」, 是「柯里化」 的一種).a
語法一般被稱爲「屬性訪問」, ["a"]
語法一般被稱爲「鍵訪問」.
操做符要求屬性名知足標識符的命名規範,而 [".."]
語法 能夠接受任意 UTF-8/Unicode
字符串做爲屬性名.
語法仍是 []
語法), 數組的 length 值並未發生變化(OtherObj.methodName.call(this, ...))
, 這會讓代碼更加難懂而且難以維護[prototype]
機制的威力(委託)而且避免沒必要要的麻煩(好比使用new的構造函數調用會生成.prototype和.constructor引用)Object.create(null)
會建立一個擁有空[prototype]
連接的對象,這個對象沒法委託[Prototype]
機制就是指對象中的一個內部連接引用另外一個對象[prototype]
機制實現的Foo.prototype
在a1的[prototype]
鏈上,因此instanceof操做告訴咱們a1是Foo類的一個實例。從語法角度上說:instanceof彷佛是檢查a1和Foo的關係,但實際上它想說的是a1和Foo.prototype(引用的對象)是互相關聯的