検索
ホームページウェブフロントエンドjsチュートリアルJavaScript のクロージャーの紹介 (Situ Zhengmei)_JavaScript スキル

クロージャの定義は非常に曖昧です。クロージャとは、構文ドメインが特定の領域に位置し、外部の実行ドメイン内の非永続変数値を継続的に参照 (読み取りおよび書き込み) する機能を備えた段落を指します。エリア内の独自のスコープ。実行スコープの外にあるこれらの非永続変数は、クロージャが最初に定義された (または作成された) ときの値 (ディープリンク) を魔法のように保持します。簡単に言うと、クロージャは、上位レベルの関数またはスコープから取得した変数 (キーと値のペア) のコピーを別のスコープに保存します。これらのキーと値のペアは、上位レベルの関数の実行には従いません。完成したら。 Zhou Aimin氏は、クロージャは「属性テーブル」であり、クロージャはデータブロックであり、クロージャは「名前=値」を格納する比較テーブルであると、より明確に述べました。それはとても簡単です。ただし、クロージャは実行時の概念であることを強調しておく必要があります。
JavaScript のクロージャには 2 つの特徴があります:
関数変数への参照として - 関数が返されるときにアクティブ化されます。
クロージャは、関数が戻ったときにリソースを解放しないスタック領域です。
現在、認識されているクロージャ実装は 3 つあります:

コードをコピー コードは次のとおりです:

with(obj){
//これがオブジェクト クロージャです
}

コードをコピーします コードは次のとおりです。

(function(){
//関数クロージャー
})()

コードをコピー コードは次のとおりです:

try{
//...
} catch( e) {
//catch クロージャーですが IE にはありません
}

いくつかの便利な例
コードをコピーします コードは次のとおりです:

//**************** クロージャ uniqueID******** ********
uniqueID = (function(){ //この関数の呼び出しオブジェクトは値を保存します
var id = 0; //これはプライベート永続値です
//外側の関数は、アクセスできる永続値を返します。 ネストされた関数
//これは、変数 uniqueID に保存したネストされた関数です。 //Return, self。 -increment.
})() ; //定義後に外部関数を呼び出します。
document.writeln(uniqueID());
document.writeln(uniqueID()); //2
document.writeln(uniqueID()); //4




コードをコピー コードは次のとおりです: //****** ************クロージャ階乗** ***********
var a = (function(n){
if(nif( n==1){ return 1; }
else{ return n * argument.callee(n-1); 4);
document.writeln(a);





コードをコピーします
コードは次のとおりです: function User(properties ) { //現在のインスタンスを指すように変数をここで宣言する必要があります
var objthis = this;
for ( var i inproperties ) {
(function(){
//クロージャの内部では、t は毎回 new であり、
var t = property[i] の場合、properties[i] の値が内部にあります。
objthis[ "get" i ] = function() {return t;};objthis[ "set" i ] = function(val) {t = val;})(); }
}
//テストコード
var user = new User({
名前: "ボブ",
年齢: 44
}); getname());
alert(user.getage());
alert(user.getage()); ));
user.setage( 22 );
alert ( user.getage());


が質問です今日、Wuyou で次のことを確認しました:
リクエスト:
これを 3 つのノードの Onclick イベントで、対応するパラメーターを正しくポップアップできます。




コードをコピー

コードは次のとおりです:


  • aa

  • aa
  • ;li id="a3">aa





    Situ Zhengmei による JavaScript クロージャー
    [Ctrl A すべて選択 注: 外部 Js を導入する必要がある場合は、更新して実行する必要があります ] My説明は、onclick バインディング関数 function(){alert(i)} のスコープは、対応する li オブジェクトであり、alert の i のスコープは window です。各ループは window.i の値を書き換えているため、ループの後はが完了すると、i はすでに 4 になり、どの li 要素をクリックしても 4 になります。
    解決策:
    関数クロージャーを使用します。


    var lists = document.getElementsByTagName("li ");
    for(var i=0,l=lists.length; i lists[i].onclick = (function(i){//外部関数に保存
    return function(){
    alert(i);
    }
    })(i)
    }



    コードをコピーします
    コードは次のとおりです。 var lists = document.getElementsByTagName("li"); for(var i=0); ,l=リスト; i lists[i] = new function(){
    return function(){
    (t 1)
    }
    }
    }





    Situ Zhengmei による JavaScript クロージャー
    [Ctrl A すべて選択 注:
    外部 Js を導入する必要がある場合は、更新して実行する必要があります ] を使用しますイベント プロキシ


    コードをコピー
    コードは次のとおりです。 var ul = document.getElementsByTagName( "ul")[0]; ul.onclick = function(){
    var e = argument[0] ||
    target = e.srcElement ?ターゲット;
    if(target .nodeName.toLowerCase() == "li"){
    alert(target.id.slice(-1))
    }
    }





    Situ Zhengmei による JavaScript クロージャー

    [Ctrl A すべて選択 注: 外部 Js を導入する必要がある場合は、更新して実行する必要があります ] Keepノード上の要素内の一時変数。


    コードをコピー コードは次のとおりです:

    var lists = document.getElementsByTagName("li");
    for(var i=0,t=0,el; el = list[i++];){
    el.i = t++
    el.onclick = function(){
    alert(this.i)
    }
    }


    使用with语句造成的对象闭包。
    复制代码 代码如下:

    var els = document.getElementsByTagName("li")
    for(var i=0,n=els.length;iwith ({i:i})
    els[i].onclick = function() { alert(this.innerHTML+i) };
    }


    [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

    使用try...catch语句构造的异常闭包:
    复制代码 代码如下:

    var lists = document.getElementsByTagName("li");
    for(var i=0,l=lists.length; i try{
    throw i;
    }catch(i){
    lists[i].onclick = function(){
    alert(i)
    }
    }
    }


    [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

    复制代码 代码如下:

    var els = document.getElementsByTagName("li");
    (''+Array(els.length+1)).replace(/./g,function(a,i){
    els[i].onclick=function(){alert(i)}
    })
    声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    一文浅析Golang中的闭包一文浅析Golang中的闭包Nov 21, 2022 pm 08:36 PM

    闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。 换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。 闭包会随着函数的创建而被同时创建。

    python闭包有哪些python闭包有哪些Oct 30, 2023 pm 04:53 PM

    python闭包主要包括函数闭包和装饰器闭包。详细介绍:1、函数闭包是指在一个函数内部返回另一个函数,并且返回的函数能够访问到其内部变量。这样的返回函数就是函数闭包,函数闭包在程序中可以被反复使用,因此可以用来实现一些功能上的封装;2、装饰器闭包是指在使用装饰器时,被装饰的函数并没有直接被调用,而是被包装在一个函数内部,并返回一个新的函数。这个新的函数就是一个装饰器闭包等等。

    如何利用PHP7的匿名函数和闭包实现更加灵活的代码逻辑处理?如何利用PHP7的匿名函数和闭包实现更加灵活的代码逻辑处理?Oct 21, 2023 am 10:21 AM

    如何利用PHP7的匿名函数和闭包实现更加灵活的代码逻辑处理?在PHP7之前,我们经常使用函数来封装一段特定的逻辑,然后在代码中调用这些函数来实现特定的功能。然而,有时候我们可能需要在代码中定义一些临时的逻辑块,这些逻辑块没有必要创建一个独立的函数,同时又不想在代码中引入太多的全局变量。PHP7引入了匿名函数和闭包,可以很好地解决这个问题。匿名函数是一种没有名

    Python中的闭包是如何实现的?Python中的闭包是如何实现的?Oct 21, 2023 am 10:33 AM

    Python中的闭包是如何实现的?闭包是一种函数内部定义的函数,并且在函数内部引用了外部函数的变量。这种特性使得内部函数可以访问外部函数的变量,并且在外部函数执行完毕后,闭包仍然可以访问和操作外部函数的变量。闭包在Python中通过以下几个步骤来实现:定义外部函数,并在其中定义内部函数:首先,我们需要在外部函数内部定义一个内部函数。这个内部函数即是闭包。de

    react有哪些闭包react有哪些闭包Oct 27, 2023 pm 03:11 PM

    react有事件处理函数、useEffect和useCallback、高阶组件等等闭包。详细介绍:1、事件处理函数闭包:在React中,当我们在组件中定义一个事件处理函数时,该函数会形成一个闭包,可以访问组件作用域内的状态和属性。这样可以在事件处理函数中使用组件的状态和属性,实现交互逻辑;2、useEffect和useCallback中的闭包等等。

    如何使用PHP7的匿名函数和闭包实现更加灵活和可复用的代码逻辑?如何使用PHP7的匿名函数和闭包实现更加灵活和可复用的代码逻辑?Oct 24, 2023 am 10:30 AM

    如何使用PHP7的匿名函数和闭包实现更加灵活和可复用的代码逻辑?在PHP编程领域中,匿名函数和闭包是非常有价值和强大的工具。PHP7引入了一些新的语言特性,使得使用匿名函数和闭包更加方便和灵活。本文将介绍如何使用PHP7的匿名函数和闭包来实现更加灵活和可复用的代码逻辑,并提供一些具体的代码示例。一、匿名函数匿名函数是一种没有名称的函数。在PHP中,可以将匿名

    怎么样减少闭包的产生怎么样减少闭包的产生Oct 27, 2023 pm 04:28 PM

    减少闭包产生的方法有避免不必要的闭包、控制闭包的返回值、使用弱引用、减少不必要的全局变量、合理使用循环和递归、使用事件代理、编写单元测试、遵循设计原则和使用工具进行代码分析等。详细介绍:1、避免不必要的闭包,在很多情况下,闭包并非必需的,可以用模块模式来实现私有变量,避免使用闭包;2、控制闭包的返回值,在使用闭包时,应该尽量控制闭包的返回值,如果闭包返回的是基本数据类型等等。

    如何解决Python的闭包错误?如何解决Python的闭包错误?Jun 24, 2023 pm 11:23 PM

    Python是一种非常流行的编程语言,因为它非常易学易用,同时也具备了强大的功能。其中,闭包是Python中的一种函数,它可以在函数的内部定义另一个函数,并返回这个函数作为函数的返回值。尽管闭包非常方便,但有时会出现某些错误,比如闭包错误。本文将介绍如何解决Python的闭包错误。初步了解闭包在Python中,闭包是由一个内部函数和一个定义在内部函数之外的函

    See all articles

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    WebStorm Mac版

    WebStorm Mac版

    便利なJavaScript開発ツール

    mPDF

    mPDF

    mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    PhpStorm Mac バージョン

    PhpStorm Mac バージョン

    最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

    MinGW - Minimalist GNU for Windows

    MinGW - Minimalist GNU for Windows

    このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。