理解上下文與作用域


一直以來沒有對上下文(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)

兩者一個基於對象一個基於函數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM