乙個函式呼叫模式的小坑

2021-07-10 10:46:04 字數 1712 閱讀 7526

昨天覆習了下閉包,遇到乙個思考題,糾結了好久,才發現自己基礎原來那麼差。

貼出來:

var name = "the window";   

var object = ;

}

};

alert(object.getnamefunc()()); //the window

我掉進了閉包的坑里,為啥返回的函式就不能維持this的值呢。

這裡只提到函式呼叫模式,和方法呼叫模式,犀牛書解答了疑問:和變數不同,關鍵字this沒有作用域的限制,巢狀的函式不會從呼叫它的函式中繼承this,如果巢狀函式作為方法呼叫,其this指向呼叫它的物件,如果巢狀函式作為函式呼叫,其this值不是全域性物件(非嚴格模式下)就是undefined(嚴格模式下)。

很明顯,上面的**object.getnamefunc()返回的是乙個匿名函式,並非屬於物件object的函式,所以此時它只是乙個普通函式function(),所以引用的this自然就繫結在全域性物件window上。

ok,其實倘若語言設計正確,當內部函式呼叫時,this也可以仍然繫結到外部函式的this變數上。但這個時候,我們需要給外部函式getnamefunc定義乙個變數並給它賦值為this,那麼內部函式通過該變數訪問到指向該物件的this,於是我們就有了乙個閉包的實證,如:

var name = "the window";   

var object = ;

}

};

alert(object.getnamefunc()()); //the object

yeah,此時匿名函式作為getnamefunc的閉包可以引用到它的變數self。

所以還有個有趣的問題:

var name = "the window";   

varobject =

};

alert(object.getnamefunc())//the object 很明顯,這是乙個物件的函式執行,所以會引用外層物件的私有變數。

alert((object.getnamefunc=object.getnamefunc)())//猜猜答案是什麼

沒錯,答案是全域性的the window,所以可以想到此時(object.getnamefunc=object.getnamefunc)指向函式本身,所以得到的應該是函式function()

此時要注意的是,(object.getnamefunc=object.getnamefunc)跟沒有括號object.getnamefunc=object.getnamefunc向右傳遞的結果是不一樣的, 前者傳遞的是函式,後者傳遞的是物件方法。

但是!

又有乙個問題來了

alert((object.getnamefunc=object.getnamefunc)==function

())//答案是false!!!

就是說這兩個函式不相等….又挖了個坑….

下次再解…..

mongodb的乙個小坑

若collection裡有其他的資料,顯示時注意要往query裡新增true,並且需要放在最前面。解釋 下圖是名為test的collection裡面的資料。可以看到上面5條是一樣的資料,第6條是為了測試故意新增進去的。首先,當你執行命令db.getcollection test find 結果如下。...

Mybatis的乙個小坑

以前一直用的ibatis,前陣子才改用的mybatis,對於一些細節不太了解,所以踩了這個坑。廢話不多說,上 下面是出問題的sql語句 insert into g label obj relation his id label obj relation,id label,followed obj c...

sprintf sscanf中的乙個小坑

char buf 32 sprintf buf,s,d test 100 char out 32 int i 0 sscanf buf,s,d out,i 這段 開始以為會正常執行,結果卻是crash。sscanf在解析 s的時候遇到空格 指標符號 n才會停止解析,而這個 s後面的逗號基本上是乙個擺...