国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Javascript的this詳解

2024-05-06 15:41:27
字體:
來源:轉載
供稿:網友

在理解javascript的this之前,首先先了解一下作用域。

作用域分為兩種:

    1、詞法作用域:引擎在當前作用域或者嵌套的子作用域查找具有名稱標識符的變量。(引擎如何查找和在哪查找。定義過程發生在代碼書寫階段) 2、動態作用域:在運行時被動態確定的作用域。

詞法作用域和動態作用域的區別是:詞法作用域是在寫代碼或定義時確定的;動態作用域是在運行時確定的。

this的綁定規則

this是在調用時被綁定,取決于函數的調用位置。由此可以知道,一般情況下(非嚴格模式下),this都會根據函數調用(調用棧)的上下文來綁定對象。

一、默認綁定

默認綁定:默認綁定是指在非嚴格模式下,且沒有使用別的綁定規則時,this根據函數調用(調用棧)的上下文來綁定對象(全局對象)。(嚴格模式下則綁定undefined)

舉個栗子:

function foo() {  console.log(this.a);};function bar() {  var a = 3;  foo();}var a = 2;bar(); //調用棧在全局作用域,this綁定全局對象

運行結果為: 2

//加上"use strict"運行結果則會變成this is undefined

這里的函數調用時,使用了默認綁定,函數調用(調用棧)的上下文是全局作用域,因此this綁定了全局對象(global)。

eg2:

function foo() {  console.log(this.a)};var a = 2;(function() {  "use strict"  foo();})();

運行結果為: 2

 這里需要注意:對于默認綁定,決定this綁定對象的不是調用位置是否處于嚴格模式,而是函數體是否處于嚴格模式(函數體處于嚴格模式則this綁定undefined;否則this綁定全局對象)。另外:嚴格模式和非嚴格模式雖然有可能可以綁定,但是最好不混用。

間接引用一般也是會應用默認綁定規則。

function foo() {  console.log(this.a);};var a = 2;var o = { a: 3, foo: foo };var p = { a: 4 };o.foo();  //3(p.foo = o.foo)(); //2

賦值表達式 p.foo = o.foo的返回值是直接引用目標函數foo。

二、隱式綁定

隱式綁定:由上下文對象調用,綁定到上下文對象。

舉個栗子:

function foo() {  console.log(this.a);};var obj = {  a: 2,  foo: foo};obj.foo();  //2foo();    //undefined

這段代碼中,foo()被當做引用屬性添加到obj對象中,obj調用這個引用屬性函數時,會使用該引用屬性上下文,this會被綁定到obj對象。(這個函數嚴格來說不屬于obj對象,只是作為引用屬性)。屬于隱式綁定。

而下面foo()函數的直接執行,并不是obj對象引用,所以上下文對象是全局對象。故this綁定了undefined。屬于默認綁定。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 若尔盖县| 阿城市| 惠安县| 和林格尔县| 蒲江县| 沙田区| 永定县| 祁东县| 赤城县| 额敏县| 沂源县| 双桥区| 盐源县| 增城市| 南阳市| 通山县| 嘉定区| 潼南县| 勐海县| 阳山县| 普兰店市| 吉木萨尔县| 和平县| 台北县| 连江县| 丰宁| 霍山县| 阿克苏市| 文登市| 安阳县| 云浮市| 宽甸| 眉山市| 翁源县| 原平市| 祁连县| 阆中市| 开远市| 普宁市| 东台市| 北碚区|