Js函式和物件學習體會
最近在通過廖雪峰老師的網站學習javascript,學到箭頭函式的時候,我才對this的指向完全懵逼,於是陸續看了幾篇文章,先從原理上講了建立,例項化及呼叫的過程。
一 this指向
1 基本原理
關於JavaScript函式執行環境的過程,IBM developerworks文件庫中的一段描述感覺很不錯,摘抄如下:
“JavaScript 中的函式既可以被當作普通函式執行,也可以作為物件的方法執行,這是導致 this 含義如此豐富的主要原因。一個函式被執行時,會建立一個執行環境(ExecutionContext),函式的所有的行為均發生在此執行環境中,構建該執行環境時,JavaScript 首先會建立 arguments
變數,其中包含呼叫函式時傳入的引數。接下來建立作用域鏈。然後初始化變數,首先初始化函式的形參表,值為 arguments
變數中對應的值,如果 arguments
變數中沒有對應值,則該形參初始化為 undefined
。如果該函式中含有內部函式,則初始化這些內部函式。如果沒有,繼續初始化該函式內定義的區域性變數,需要注意的是此時這些變數初始化為 undefined
,其賦值操作在執行環境(ExecutionContext)建立成功後,函式執行時才會執行,這點對於我們理解 JavaScript 中的變數作用域非常重要,鑑於篇幅,我們先不在這裡討論這個話題。最後為 this
變數賦值,如前所述,會根據函式呼叫方式的不同,賦給 this
全域性物件,當前物件等。至此函式的執行環境(ExecutionContext)建立成功,函式開始逐行執行,所需變數均從之前構建好的執行環境(ExecutionContext)中讀取。”
(http://www.cnblogs.com/isaboy/archive/2015/10/29/javascript_this.html)
2 通過呼叫方式判斷(非嚴格模式)
可以根據是否通過new的方式呼叫,是則指向當前,否則繼續是否通過 .xx 的方式呼叫,是則指向當前,否則指向window
這裡講到了建構函式的概念:當任意一個普通函式用於建立一類物件時,它就被稱作建構函式,或構造器。
1、 在函式內部對新物件(this)的屬性進行設定,通常是新增屬性和方法。
2、 建構函式可以包含返回語句(不推薦),但返回值必須是this,或者其它非物件型別的值。
function obj2(name,age){ this.name = name; this.age = age; this.say=function(){ return "我是:"+this.name+"我很帥,帥的不得了"; } }
var o = new obj2(); |
那麼,在使用new操作符來呼叫一個建構函式的時候,發生了什麼呢?其實很簡單,就發生了四件事:
var obj ={}; obj.__proto__ = CO.prototype; CO.call(obj); return obj; |
3 特殊的箭頭函式
箭頭函式的呼叫的函式內判斷,判斷此函式是否包含this,否則就向上一層判斷
箭頭函式this的定義:箭頭函式中的this是在定義函式的時候繫結,而不是在執行函式的時候繫結。
var x=11;
var obj={x:22,
say:()=>{
console.log(this.x);
}
}
obj.say();
//輸出的值為11
所謂的定義時候繫結,就是this是繼承自父執行上下文!!中的this,比如這裡的箭頭函式中的this.x,箭頭函式本身與say平級以key:value的形式,也就是箭頭函式本身所在的物件為obj,而obj的父執行上下文就是window,因此這裡的this.x實際上表示的是window.x,因此輸出的是11。
4.嚴格模式
在嚴格模式下,未指定環境物件而呼叫函式,則 this 值不會轉型為 window。 除非明確把函式新增到某個物件或者呼叫 apply()或 call(),否則 this 值將是 undefined。
嚴格模式下,沒有宿主呼叫的函式中的this是undefined!!!所以箭頭函式中的也是undefined!
二 函式和物件的關係
物件內封裝函式
var person = {
firstName:"zhang",
lastName:"erga",
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
三 作用域和作用域鏈
https://www.cnblogs.com/wupeiqi/p/5649402.html
四 函式呼叫方式
https://www.cnblogs.com/liu666/p/5751363.html
相關文章
- js的函式和物件JS函式物件
- js函式,arguments物件JS函式物件
- JS的學習理解--->函式JS函式
- JS學習理解之閉包和高階函式JS函式
- 學習javaScript必知必會(1)~js介紹、函式、匿名函式、自呼叫函式、不定長引數JavaScriptJS函式
- js純函式學習筆記(一)JS函式筆記
- JS 會有變數提升和函式提升JS變數函式
- 工廠方法、建構函式、原型物件——JS基礎學習筆記(四)函式原型物件JS筆記
- js變數與函式常識學習JS變數函式
- JS函式,物件,例項方法,物件方法理解JS函式物件
- ES6學習筆記(三)【函式,物件】筆記函式物件
- JS基礎-函式、物件和原型、原型鏈的關係JS函式物件原型
- C#和TS/JS的對比學習02:函式與方法C#JS函式
- JS-陣列、函式、類與物件JS陣列函式物件
- JS函式節流和函式防抖JS函式
- 函式學習函式
- 例項物件和函式物件的區別物件函式
- js-arguments 函式引數物件詳解JS函式物件
- PHP 手冊 (類與物件) 學習筆記五:建構函式和解構函式PHP物件筆記函式
- spark RDD的學習,filter函式的學習,split函式的學習SparkFilter函式
- 物聯網學習教程—函式引數和函式的值函式
- MySQL函式學習(一)-----字串函式MySql函式字串
- 胡扯JS系列-記憶體模型和函式執行JS記憶體模型函式
- 函式物件、物件、原型函式物件原型
- 淺談js函式節流和函式防抖JS函式
- C++ 常物件和常函式C++物件函式
- 函式學習五函式
- 函式學習二函式
- 函式學習四函式
- 函式學習六函式
- 函式學習三函式
- 函式的學習函式
- 學習Rust 函式Rust函式
- JS 函式式概念: 管道 和 組合JS函式
- JS建構函式,原型鏈,原型物件總結JS函式原型物件
- JS function 是函式也是物件, 淺談原型鏈JSFunction函式物件原型
- js學習日記-物件字面量JS物件
- (譯) 函式式 JS #2: 函式!函式JS