一直以來沒有對上下文(context)的定義,總有些模糊,沒有認真地總結過,聽到這個詞,會想到看過的“上下文是函數執行環境”,“上下文是this”,但真的讓自己去解釋還真說不上來,故趁今日有空總結溫故一番,有什么錯誤的,還望大家提出!
《javascript權威指南》里是第8章函數導讀頁里有這樣介紹到:
函數使用它們實參的值 來計算返回值,成為該函數調用表達式的值。除了實參之外,每次調用還會擁有另外一個值——本次調用的上下文——這就是this關鍵字的傳值。
如果函數掛載在一個對象上,作為對象的一個屬性,就稱它為對象的方法。當通過這個對象來調用函數時,該對象就是此次調用上下文(context),也就是該函數的this的值 。用於初始化一個新創建的對象的函數稱為構造函數。
寫一段簡單的代碼理解這段話:
//定義一個對象
var context = { foo: "bar", func : function(){ console.log(this);//打印上下文 return this.foo; } };
//當通過這個對象來調用函數時,該對象就是此次調用上下文(context),也就是該函數的this的值 context.func();
控制台輸出結果:

this代碼了該函數的上下文(context),即對象context本身;
作用域:函數的執行依賴於變量作用域,這個作用域是在函數定義時決定的,而不是函數調用時決定的。
因為沒理解好這條規則,故前兩天晚上看了篇文章的示例沒能理解,一直想不通 T T
示例:( 一直在想為什么第二個bar輸出的是1,不是2 )
function foo(){ var x = 1; return function() { alert(x); } }; var bar = foo(); bar(); // 1 var x = 2 ; bar(); // 1
好吧,作用域在函數定義時決定的,現在明白了,原諒我的無知......
接下來,來把頭腦內混亂的 “上下文?作用域?上下文?作用域?” 再度區分下吧。
上下文(context)->this->掛載着變量與函數的對象(object-base)
作用域->函數定義時決定->作用於函數(function-base)
兩者一個基於對象一個基於函數。
