Closure (クロージャ) は、JavaScript を初歩から深くマスターするための非常に重要な閾値です。これは、JavaScript 言語の難しさであり、多くの高度なアプリケーションがクロージャに依存しているという特徴でもあります。以下に私の勉強メモを書いてください~
シリーズ目次!function() { var localData = "localData here"; document.addEventListener('click', //处理点击事件时用到了外部局部变量,比如这里的localData function(){ console.log(localData); }); }();
!function() { var localData = "localData here"; var url = "http://www.baidu.com/"; $.ajax({ url : url, success : function() { // do sth... console.log(localData); } }); }();
function outer() { var localVal = 30; return function(){ return localVal; } } var func = outer(); func(); // 30
function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000
(function() { var _userId = 23492; var _typeId = 'item'; var export = {}; function converter(userId) { return +userId; } export.getUserId = function() { return converter(_userId); } export.getTypeId = function() { return _typeId; } window.export = export; //通过此方式输出 }()); export.getUserId(); // 23492 export.getTypeId(); // item export._userId; // undefined export._typeId; // undefined export.converter; // undefined
document.body.innerHTML = "<p id=p1>aaa</p>" + "<p id=p2>bbb</p><p id=p3>ccc</p>"; for (var i = 1; i < 4; i++) { document.getElementById('p' + i). addEventListener('click', function() { alert(i); // all are 4! }); }
iは初期化が完了した後のものですその時点ではすでに4です
私たちが望むことを達成するには、aaaをクリックして出力1を、bbbをクリックして出力2を、cccをクリックして出力3を、という手法を使用する必要があります。各ループでは、すぐに実行される匿名関数を使用します。このようにして、alert(i) の値は毎回クロージャ環境の i から取得されます。各ループは 1、2、3 を出力できますdocument.body.innerHTML = "<p id=p1>aaa</p>" + "<p id=p2>bbb</p>" + "<p id=p3>ccc</p>"; for (var i = 1; i < 4; i++) { !function(i){ //②再用这个参数i,到getElementById()中引用 document.getElementById('p' + i). addEventListener('click', function() { alert(i); // 1,2,3 }); }(i); //①把遍历的1,2,3的值传到匿名函数里面 }
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()());
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ var that = this; return function(){ return that.name; }; } }; alert(object.getNameFunc()());