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

首頁 > 編程 > JavaScript > 正文

簡單談談javascript中this的隱式綁定

2019-11-20 10:32:28
字體:
來源:轉載
供稿:網友

我們先來看一個例子

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

this指向了obj,因為foo執行時的call-site(可以理解為調用時所在作用域)在obj上面。注意是運行的時候,和在哪里聲明的沒有關系。

call-site and call-stack

call-site姑且理解為調用域,call-stack為調用棧。如下代碼可以輔助我們理解

function baz() {  // call-stack is: `baz`  // so, our call-site is in the global scope  console.log( "baz" );  bar(); // <-- call-site for `bar`}

在baz()中調用bar(),所以bar的調用域是baz,此時bar的調用棧只有baz;而baz本身暴露在全局作用域中,所以它的調用域則也在全局作用域中。

function bar() {  // call-stack is: `baz` -> `bar`  // so, our call-site is in `baz`  console.log( "bar" );  foo(); // <-- call-site for `foo`}function foo() {  // call-stack is: `baz` -> `bar` -> `foo`  // so, our call-site is in `bar`  console.log( "foo" );}baz(); // <-- call-site for `baz`

理解之后再回頭看開頭的例子,是不是感覺清晰了很多。其實this只是指向了它的call-site

還有如下玩法:

function foo() {  console.log( this.a );}var obj2 = {  a: 42,  foo: foo};var obj1 = {  a: 2,  obj2: obj2};obj1.obj2.foo(); // 42Implicitly Lost(隱式丟失)function foo() {  console.log( this.a );}var obj = {  a: 2,  foo: foo};var bar = obj.foo; // function reference/alias!var a = "oops, global"; // `a` also property on global objectbar(); // "oops, global"

雖然bar引用了obj上的foo,但實際上相當于是直接對foo引用而已,所以會默認綁定到全局。

function foo() {  console.log( this.a );}function doFoo(fn) {  // `fn` is just another reference to `foo`  fn(); // <-- call-site!}var obj = {  a: 2,  foo: foo};var a = "oops, global"; // `a` also property on global objectdoFoo( obj.foo ); // "oops, global"

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桂林市| 五大连池市| 扎鲁特旗| 阳春市| 察隅县| 清原| 阿克| 西峡县| 静乐县| 通许县| 平和县| 扶沟县| 新安县| 浙江省| 邳州市| 塔河县| 繁峙县| 望谟县| 永康市| 澎湖县| 昂仁县| 东乌珠穆沁旗| 原平市| 平昌县| 丁青县| 凌源市| 富源县| 泽州县| 灵石县| 曲松县| 青海省| 泗洪县| 衡水市| 海门市| 台中市| 收藏| 崇仁县| 沂水县| 洪雅县| 噶尔县| 九寨沟县|