new > 顯式 > 隱式 > 預設
function
foo(
)var a =2;
foo();
// 2
<
----
----2--
----
----
>
function
foo(
)var a =2;
foo();
// typeerror: this is undefined
function
foo(
)var obj =
;obj.
foo();
// 2
<
----
-------
2------
----
->
function
foo(
)var obj2 =
;var obj1 =
;obj1.obj2.
foo();
// 42
<
------3
----
----
----
>
function
foo(
)var obj =
;var bar = obj.foo;
// 函式別名!
var a =
"oops, global"
;// a 是全域性物件的屬性 bar(); // "oops, global"
//雖然 bar 是 obj.foo 的乙個引用,但是實際上,它引用的是 foo 函式本身,因此此時的 bar() 其實是乙個不帶任何修飾的函式呼叫,因此應用了預設繫結。
<
----
----4--
----
----
>
function
foo(
)function
dofoo
(fn)
var obj =
;var a =
"oops, global"
;// a 是全域性物件的屬性
dofoo
( obj.foo )
;// "oops, global"
//引數傳遞其實就是一種隱式賦值,因此我們傳入函式時也會被隱式賦值。
function
foo(
)var obj =
;foo.
call
( obj )
;// 通過 foo.call(..),呼叫 foo 時強制把它的 this 繫結到 obj 上。
<
----
-------
2------
----
-->
function
foo(
)var obj =
;var
bar=
function()
;bar()
;// 2
settimeout
( bar,
100)
;// 2
// 硬繫結的 bar 不可能再修改它的 this
bar.
call
( window )
;// 2
<
----
----3--
----
-->
function
foo(something)
// 簡單的輔助繫結函式
function
bind
(fn, obj);}
var obj =
;var bar =
bind
(foo, obj)
;var b =
bar(3)
;// 2 3
console.
log(b)
;// 5
function
foo(a)
var bar =
newfoo(2
); console.
log( bar.a )
;// 2
現在我們可以根據優先順序來判斷函式在某個呼叫位置應用的是哪條規則。可以按照下面的 順序來進行判斷:
函式是否在 new 中呼叫(new 繫結)?如果是的話 this 繫結的是新建立的物件。 var bar = new foo()
函式是否在某個上下文物件中呼叫(隱式繫結)?如果是的話,this 繫結的是那個上 下文物件。 var bar = obj1.foo()
如果都不是的話,使用預設繫結。如果在嚴格模式下,就繫結到 undefined,否則繫結到 全域性物件。 var bar = foo()
亞馬遜雲安全20條規則
譯自twentyrules for amazon cloud security 1.加密所有網路通訊 2.只使用加密的檔案系統 3.高強度加密您放在 s3上所有檔案 4.絕對不能讓解密的金鑰進入雲,除非用於解密程序 5.除了用於解密檔案系統的金鑰外,絕對不能在 ami中放置使用者的認證證書 6.在例...
亞馬遜雲安全20條規則
譯自twentyrules for amazon cloud security 1.加密所有網路通訊 2.只使用加密的檔案系統 3.高強度加密您放在s3上所有檔案 4.絕對不能讓解密的金鑰進入雲,除非用於解密程序 5.除了用於解密檔案系統的金鑰外,絕對不能在ami中放置使用者的認證證書 6.在例項啟...
前端效能優化 14 條規則
前端優化的 準則指導著前端頁面的優化策略 只有10 20 的終端使用者響應時間花在接受請求的html文件上,剩下的80 90 時間花在為html文件所引用的所有元件 指令碼 樣式表等 進行的http請求上。因此,改善響應時間的最簡單途徑就是減少元件的數量,並由此減少http請求的數量。當然很多人就會...