摘要:此段代碼出自高級程序設計第版,代碼片段如下理解此段代碼,首先要明確一個點賦值語句是有返回值的,返回值就是所賦的值也就是右邊的值。那么上面這個賦值語句的返回值就是指向的函數體本身了那么其實就相當于該段代碼的調用者為,所以指向,最終結果為。
1.
此段代碼出自《JavaScript高級程序設計(第3版)》 p.183,代碼片段如下:
var name = "The Window"; var object = { name : "My Object", getName: function(){ return this.name; } }; (object.getName = object.getName)(); //"The Window"
理解此段代碼,首先要明確一個點:賦值語句是有返回值的,返回值就是所賦的值(也就是‘=’右邊的值)。
object.getName = object.getName ;
上面這行代碼的含義就是:將等號左邊 object 對象的 getName 方法賦值為 object.getName。(剛看這段代碼時犯了一個錯誤,即getName 方法后面是沒有加括號的,也即是函數不執行,僅僅是傳遞了它的引用。)
那么上面這個賦值語句的返回值就是 object.getName 指向的函數體本身了:
function(){ return this.name; }
那么 (object.getName = object.getName)();其實就相當于:
(function(){ return this.name; })();
該段代碼的調用者為 window,所以 this 指向window,最終結果為 "The Window"。
2.
怎樣理解紅寶書182頁這段代碼。
var name = "The Window"; var object = { name : "My Object", getNameFunc : function() { return function() { return this.name; }; } }; alert(object.getNameFunc()());
首先定義了一個全局變量 name = "The Window";隨后在 object 對象里又重新給 name 賦值為 "My Object",但是此時 name 為局部變量,object 對象還有一個方法 getNameFunc ,這個方法返回一個閉包。
object.getNameFunc()() 這一表達式其實可以分解為兩步:
var first = object.getNameFunc(),調用 getNameFunc 方法,那么就相當于:
var first = function() { return this.name; };
var second = first(),調用第一步返回的閉包,相當于:
var second = function() { return this.name; }();
而此時是在全局作用域中調用 first 函數,所以里面的 this 對象等于 window,那么 返回的是:window.name,就是"The Window"。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95926.html
摘要:在一個閉包環境內修改變量值,不會影響另一個閉包中的變量。直到看到函數閉包閉包這篇文章的代碼一部分,終于明白其中的邏輯了。 閉包 閉包定義:指擁有多個變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。函數內部可以直接讀取全局變量。函數內部變量無法在函數外部訪問。函數內部聲明要用var或者let聲明,不然會變成全局變量鏈式作用域:子對象會一級級向上尋找...
摘要:不過匿名函數的執行環境具有全局性,因此其對象通常指向。在閉包中使用對象可能會導致一些問題。這個對象還包含一個方法它返回一個匿名函數,而匿名函數又返回,這個匿名函數就是閉包。偽代碼過程在定義匿名函數之前,把對象賦值給了一個名叫的變量。 this對象 前言:最近在細讀Javascript高級程序設計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。如有紕漏...
摘要:刪除對匿名函數的引用,以便釋放內存在匿名函數從中被返回后,它的作用域鏈被初始化為包含函數的活動對象和全局變量對象。閉包與變量我們要注意到,閉包只能取到任意變量的最后值,也就是我們保存的是活動對象,而不是確定值。 工作中會遇到很多 this對象 指向不明的問題,你可能不止一次用過 _self = this 的寫法來傳遞this對象,它每每會讓我們覺得困惑和抓狂,我們很可能會好奇其中到底發...
摘要:別的文章一來就舉例子,我這里首先告訴大家一個結論指向的是調用函數的那個對象。這里依然是之前的例子中的俗稱箭頭函數,使用它來定義匿名函數,同樣可以解決的綁定問題這是由于函數體內的就是定義時所在的對象,而不是執行時所在的對象。 一、結論在前 javascript中的this是一個老生常談的話題,但不知道是之前那些作者沒講清楚還是我太笨沒能理解,始終沒能真正理解它,隨著自己在項目過程中的大量...
摘要:閉包的注意事項通常,函數的作用域及其所有變量都會在函數執行結束后被銷毀。但是,在創建了一個閉包以后,這個函數的作用域就會一直保存到閉包不存在為止。最后通過釋放了和對閉包的引用。從而使用閉包模塊化代碼,減少全局變量的污染。 JavaScript 閉包 原文鏈接 什么是閉包(Closure) 簡單講,閉包就是指有權訪問另一個函數作用域中的變量的函數。 MDN 上面這么說:閉包是一種特殊的...
閱讀 1626·2021-09-02 09:55
閱讀 1092·2019-08-30 13:19
閱讀 1394·2019-08-26 13:51
閱讀 1445·2019-08-26 13:49
閱讀 2372·2019-08-26 12:13
閱讀 452·2019-08-26 11:52
閱讀 1899·2019-08-26 10:58
閱讀 3084·2019-08-26 10:19