javascriptの閉鎖について話します。
2186 ワード
クローズドについての説明
作用するドメインチェーンを結合されたスタックではなく、オブジェクトリストとして説明します。javascript関数を呼び出すたびに、変数を保存するために新しいオブジェクトを作成します。このオブジェクトを作用領域に追加します。関数が戻ると、作用領域チェーンからこのバインディング変数のオブジェクトを削除します。ネスト関数が存在しないと、このバインディングの対象に他の参照がないので、ゴミが回収されます。
閉塞されたパケットに関連するスコープチェーンはすべてアクティブであり、ネストされた関数は、作用領域内のプライベートメンバをコピーしたり、バインディングされた変数に静的スナップを生成したりしない。クローズド時にthisは変数ではなくjavascriptのキーワードです。
解決策
作用するドメインチェーンを結合されたスタックではなく、オブジェクトリストとして説明します。javascript関数を呼び出すたびに、変数を保存するために新しいオブジェクトを作成します。このオブジェクトを作用領域に追加します。関数が戻ると、作用領域チェーンからこのバインディング変数のオブジェクトを削除します。ネスト関数が存在しないと、このバインディングの対象に他の参照がないので、ゴミが回収されます。
(function () {
var val = null;
var callback;
setTimeout(function () {
val = 1;
callback(val)
},1000)
window.getVal = function(fn){
callback = fn;
}
})();
(function(){
var b =3;
getVal(function (val) {
console.log(val);//1
console.log(b); //3
getVal(function (val) {
console.log(val);
console.log(b); // b /.
});
// , getVal , , ?
})();
//2
(function(){
var b =3;
var ret = function (val) {
console.log(val);
クローズドによるプライベート属性のアクセス方法
function c
return {
count:function(){
return n++;
}
};
}
var a=counter();
alert(a.count());// 0;
alert(a.count());// 1;
定義された閉じられたパッケージを実装するプライベート属性方法
function addPrivateProperty(o,name,predicate){
var value;
o["get"+name]=function(){return value);}//get ,
//setter ,
o["set"+name]=function(v){{
if(predicate&&!predicate(v)) throw Error("");
else {
value=v;
}
}
典型的なエラー
function constfuncs(){
var funcs=[];
for(var i=0;i<10;i++){
funcs[i]=function(){return i;};
}
return funcs;
}
var func=constfuncs();
console.log(func[5]());
;// ? 10
この関数のクローズドパックは同じ関数呼び出しで定義されているので、変数iを共有できます。閉塞されたパケットに関連するスコープチェーンはすべてアクティブであり、ネストされた関数は、作用領域内のプライベートメンバをコピーしたり、バインディングされた変数に静的スナップを生成したりしない。クローズド時にthisは変数ではなくjavascriptのキーワードです。
解決策
function Bb(){
this.run=function(){}//this Bb ;
}
function run(){
function gg(){alert(this window)}//this window;`
}
以上が本文の全部です。本文の内容は皆さんの学習や仕事に一定の助けをもたらしてくれると同時に、私達を応援してください。