日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript闭包小窥

發布時間:2024/6/18 javascript 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript闭包小窥 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

眾所周知,JavaScript沒有塊級作用域,只有函數作用域。那就意味著定義在函數中的參數和變量在函數外部是不可見的,而在一個函數內部任何位置定義的變量,在該函數內部任何地方都可見。這帶來的好處是內部函數可以訪問定義它們的外部函數的參數和變量

?

首先,我們來構造一個簡單的對象。

1 var testObj = { 2 value: 10, 3 add: function(inc){ 4 this.value += (typeof inc === "number") ? inc : 1; 5 } 6 }; 7 8 testObj.add(); 9 testObj.value; // 11 10 11 testObj.add(2); 12 testObj.value; // 13

?

這樣寫就有一個問題,value值不能保證不會被非法修改,可以按如下的方法進行修改。

var testObj = (function(){var value = 10;return {add: function(inc){value += (typeof inc === "number") ? inc : 1;},getValue: function(){return value;}}; })();testObj.add(); testObj.getValue(); // 11 testObj.add(2); testObj.getValue(); // 13

?

我們可以通用調用一個函數的形式去初始化testObj,該函數會返回一個對象字面量,函數里定義了一個value變量,該變量對add和getValue方法總是可用的,但函數的作用域使得它對其他的程序來說是不可見的。同時,我們還可以得出一個結論,內部函數擁有比它的外部函數更長的生命周期

?

我們再繼續看一個構造函數調用的例子。

var MyObj = function(str){this.status = str; };MyObj.prototype.getStatus = function(){return this.status; };var obj = new MyObj("javascript"); obj.getStatus(); // "javascript"

?

這樣寫并沒有錯,但是會有一點“多此一舉”,為什么要用一個getStatus方法去訪問一個本可以直接訪問到的屬性呢?如果status是私有屬性,那當然才有意義。

var obj = function(status){return {getStatus: function(){return status;}}; };var myObj = obj("javascript"); myObj.getStatus(); // "javascript"

?

這里當我們調用obj的時候,它返回包含getStatus方法的一個新對象,該對象的一個引用保存在myObj中,即使obj已經返回了,但getStatus方法仍然享有訪問obj對象的status屬性的特權。getStatus方法并不是訪問該參數的一個副本,它訪問的就是該參數本身。這是可能的,因為該函數可以訪問它被創建時所處的上下文環境,這被稱為閉包

?

轉載于:https://www.cnblogs.com/stay-9527/p/4087062.html

總結

以上是生活随笔為你收集整理的JavaScript闭包小窥的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。