国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

匿名函數(shù)以及閉包內(nèi)部this指向(函數(shù)調(diào)用模式的問(wèn)題)

yy736044583 / 2449人閱讀

摘要:網(wǎng)上看到一句話,匿名函數(shù)的執(zhí)行是具有全局性的,那怎么具有的全局性呢閉包內(nèi)部的指向是,為什么指向了呢下面通過(guò)函數(shù)調(diào)用模式和部分案例分析了為什么確實(shí)如此函數(shù)調(diào)用的模式方法調(diào)用模式和函數(shù)調(diào)用模式如果一個(gè)函數(shù)被設(shè)置為一個(gè)對(duì)象的屬性,則稱(chēng)它為一個(gè)方法

網(wǎng)上看到一句話,匿名函數(shù)的執(zhí)行是具有全局性的,那怎么具有的全局性呢?閉包內(nèi)部this的指向是window,為什么指向了window呢?下面通過(guò)js函數(shù)調(diào)用模式和部分案例分析了為什么確實(shí)如此
1.js函數(shù)調(diào)用的模式 1.方法調(diào)用模式和函數(shù)調(diào)用模式

如果一個(gè)函數(shù)被設(shè)置為一個(gè)對(duì)象的屬性,則稱(chēng)它為一個(gè)方法。當(dāng)通過(guò)對(duì)象對(duì)其進(jìn)行調(diào)用時(shí),即this的方法調(diào)用模式。在方法調(diào)用模式下,函數(shù)中的this指向該函數(shù)所屬的對(duì)象。

當(dāng)一個(gè)函數(shù)并非對(duì)象的屬性,而是直接作為函數(shù)進(jìn)行調(diào)用時(shí),為函數(shù)調(diào)用模式。此模式來(lái)調(diào)用函數(shù)的時(shí)候,this綁定的是全局對(duì)象。這是語(yǔ)言設(shè)計(jì)的一個(gè)錯(cuò)誤。倘若語(yǔ)言設(shè)計(jì)正確,那么當(dāng)內(nèi)部函數(shù)被調(diào)用時(shí),this應(yīng)該仍然綁定到外部函數(shù)的this變量。這個(gè)設(shè)計(jì)錯(cuò)誤的后果就是方法不能利用內(nèi)部函數(shù)來(lái)幫助它工作,因?yàn)閮?nèi)部函數(shù)的this被綁定了錯(cuò)誤的值,所以不能共享該方法對(duì)對(duì)象的訪問(wèn)權(quán)

var obj = {
    val : 1,
    show : function(){alert(this.val);},//方法調(diào)用模式
    outFunc : function(){
        function innerFunc(){
            console.log(this);
        }
        innerFunc(); //函數(shù)調(diào)用模式
    }
};
obj.innerFunc();
//在嚴(yán)格模式下,console.log(this)中的this為undefined,
//否則,console.log(this)中的this為全局對(duì)象(瀏覽器中為window)
//下文講解為什么
2.構(gòu)造器調(diào)用模式

當(dāng)以new來(lái)調(diào)用一個(gè)函數(shù)時(shí),即構(gòu)造器模式。
當(dāng)使用new調(diào)用時(shí),發(fā)生這些事情:
創(chuàng)建一個(gè)連接到該函數(shù)prototype的新對(duì)象
將this綁定到創(chuàng)建的新對(duì)象上
函數(shù)結(jié)束時(shí),如果沒(méi)有返回其它對(duì)象,就返回this,即新創(chuàng)建的對(duì)象。

 var quo=function(string){
            this.status=string;
        }
    quo.prototype.get_status=function(){
            return this.status;
        }
    var qq=new quo("aaa");
    alert(qq.get_status());
3.上下文調(diào)用模式(call,apply)
var myobject={};
var sum = function(a,b){
  return a+b;
};
var sum2 = sum.call(myobject,10,30); //var sum2 = sum.apply(myobject,[10,30]); 
alert(sum2);
2.閉包和匿名函數(shù)案例分析(這兩種都是函數(shù)調(diào)用模式)
    var person = {
        name :"one",
        sayOne:function () {//方法調(diào)用模式
            console.log(this.name)
        },
        sayTwo:function () {//函數(shù)調(diào)用模式
            return function () {
                console.log(this.name)
            }
        },
        wrap: function(){//函數(shù)調(diào)用模式,匿名函數(shù)的執(zhí)行環(huán)境具有全局性的由來(lái)
            (function (){
                console.log(this.name)
            })()
        }
    }
    person.sayOne()//one   sayOne調(diào)用者是person對(duì)象,所以this指向person;(方法調(diào)用模式)
    person.sayTwo()()//window 返回的匿名函數(shù)在全局執(zhí)行所以是window(函數(shù)調(diào)用模式)
    person.wrap()//window 語(yǔ)言就是這樣設(shè)計(jì)的,也是匿名函數(shù)具有全局性的由來(lái)(函數(shù)調(diào)用模式)
3.事件監(jiān)聽(tīng)內(nèi)部調(diào)用方法案例分析
    var div=document.getElementById("one");
    function f2(){
    console.log(this)
    }
    div.onclick =function () {
        console.log(this)//one那個(gè)節(jié)點(diǎn)
        f2()//window(函數(shù)調(diào)用模式)
    }
4.綜合應(yīng)用:函數(shù)節(jié)流案例分析

1.throttle函數(shù)的執(zhí)行環(huán)境具有全局性,內(nèi)部this通常是指向window的,然后返回一個(gè)匿名函數(shù)。
2.返回的匿名函數(shù)綁定了事件,this指向監(jiān)聽(tīng)的元素(document)
3.fn其實(shí)與上面返回匿名函數(shù)形成了閉包,且fn也其實(shí)是一個(gè)匿名函數(shù),匿名函數(shù)的執(zhí)行具有全局性,fn內(nèi)部this應(yīng)該指向window
4這里用apply修正this指向,使fn內(nèi)部的this重新指向document

            function throttle(fn, delay) {
                console.log(this)//window
                // 記錄上一次函數(shù)觸發(fā)的時(shí)間
                var lastTime = 0;
                return function() {
                    // 記錄當(dāng)前函數(shù)觸發(fā)的時(shí)間
                    var nowTime = Date.now();
                    if(nowTime - lastTime > delay) {
                     /*
                          fn();
                        console.log(this)//document
                    */
                        
                        fn.apply(this)// 修正this指向問(wèn)題
                        console.log(this)//document
                        
                        // 同步時(shí)間
                        lastTime = nowTime;
                    }
                }
            }
            document.onscroll = throttle(function() {
                /*console.log(this)//window*/
                console.log(this)//document
                console.log("scroll事件被觸發(fā)了" + Date.now())
            }, 1000)
5.參考JS高級(jí)編程的案例解決問(wèn)題
var name = "global";

var foo = {
    name: "foo",
    getName : function(){
        console.log(this.name);
    }
}

var bar = {
    name: "bar",
    getName : function(){
        return (function(){
            console.log(this.name);
        })();
    }
}

foo.getName(); //foo
foo.getName.call(bar); //bar
foo.getName.call(this); //global
foo.getName.call(window); //global

(function(){

    console.log(this.name)

}.bind(bar))(); //bar

(function(){

    console.log(this.name)

}.bind())(); //global

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/55026.html

相關(guān)文章

  • 匿名函數(shù)以及閉包內(nèi)部this指向函數(shù)調(diào)用模式問(wèn)題

    摘要:網(wǎng)上看到一句話,匿名函數(shù)的執(zhí)行是具有全局性的,那怎么具有的全局性呢閉包內(nèi)部的指向是,為什么指向了呢下面通過(guò)函數(shù)調(diào)用模式和部分案例分析了為什么確實(shí)如此函數(shù)調(diào)用的模式方法調(diào)用模式和函數(shù)調(diào)用模式如果一個(gè)函數(shù)被設(shè)置為一個(gè)對(duì)象的屬性,則稱(chēng)它為一個(gè)方法 網(wǎng)上看到一句話,匿名函數(shù)的執(zhí)行是具有全局性的,那怎么具有的全局性呢?閉包內(nèi)部this的指向是window,為什么指向了window呢?下面通過(guò)js...

    _Zhao 評(píng)論0 收藏0
  • 匿名函數(shù)以及閉包內(nèi)部this指向函數(shù)調(diào)用模式問(wèn)題

    摘要:網(wǎng)上看到一句話,匿名函數(shù)的執(zhí)行是具有全局性的,那怎么具有的全局性呢閉包內(nèi)部的指向是,為什么指向了呢下面通過(guò)函數(shù)調(diào)用模式和部分案例分析了為什么確實(shí)如此函數(shù)調(diào)用的模式方法調(diào)用模式和函數(shù)調(diào)用模式如果一個(gè)函數(shù)被設(shè)置為一個(gè)對(duì)象的屬性,則稱(chēng)它為一個(gè)方法 網(wǎng)上看到一句話,匿名函數(shù)的執(zhí)行是具有全局性的,那怎么具有的全局性呢?閉包內(nèi)部this的指向是window,為什么指向了window呢?下面通過(guò)js...

    remcarpediem 評(píng)論0 收藏0
  • 面試官問(wèn)我:什么是JavaScript閉包,我該如何回答

    摘要:到底什么是閉包這個(gè)問(wèn)題在面試是時(shí)候經(jīng)常都會(huì)被問(wèn),很多小白一聽(tīng)就懵逼了,不知道如何回答好。上面這么說(shuō)閉包是一種特殊的對(duì)象。閉包的注意事項(xiàng)通常,函數(shù)的作用域及其所有變量都會(huì)在函數(shù)執(zhí)行結(jié)束后被銷(xiāo)毀。從而使用閉包模塊化代碼,減少全局變量的污染。 閉包,有人說(shuō)它是一種設(shè)計(jì)理念,有人說(shuō)所有的函數(shù)都是閉包。到底什么是閉包?這個(gè)問(wèn)題在面試是時(shí)候經(jīng)常都會(huì)被問(wèn),很多小白一聽(tīng)就懵逼了,不知道如何回答好。這個(gè)...

    BenCHou 評(píng)論0 收藏0
  • 《JavaScript高級(jí)程序設(shè)計(jì)》(第3版)讀書(shū)筆記 第7章 函數(shù)表達(dá)式

    摘要:定義函數(shù)表達(dá)式的方式有兩種函數(shù)聲明。不過(guò),這并不是匿名函數(shù)唯一的用途。可以使用命名函數(shù)表達(dá)式來(lái)達(dá)成相同的結(jié)果閉包匿名函數(shù)和閉包是兩個(gè)概念,容易混淆。匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其對(duì)象通常指向通過(guò)改變函數(shù)的執(zhí)行環(huán)境的情況除外。 定義函數(shù)表達(dá)式的方式有兩種: 函數(shù)聲明。它的重要特征就是 函數(shù)聲明提升(function declaration hoisting) 即在執(zhí)行代碼之前會(huì)...

    鄒立鵬 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<