亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請教個js執行順序問題?

請教個js執行順序問題?

Smart貓小萌 2019-02-27 17:23:38
var obj = {};(function(obj){    obj.m = function(){      console.log(ooo);    };    var ooo = {}; })(obj);obj.m();//可以打印出 ooo {}問題是這個ooo不是聲明在obj.m這個方法后面嗎,怎么可以打印出。本來以為是打印出underfined呢?
查看完整描述

5 回答

?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

這跟變量提升沒有關系,涉及到的知識是閉包和作用域。


閉包是一個函數,它能夠記住創建它的那個作用域,并且在那個作用域外調用時仍然能夠訪問那個作用域里的變量。

分析你的代碼:


var obj = {};

(function(obj){//作用域,命名為Scope

    obj.m = function(){

        //obj.m是一個聲明在Scope中函數,記住了當前作用域Scope。

      console.log(ooo);

    };

    var ooo = {};//聲明在Scope中

 })(obj);

obj.m();//當obj.m在Scope中調用時,根據閉包的定義,自然可以打印出 ooo {}

至于為什么不是打印undefined,是因為執行obj.m();時,Scope中的ooo已經完成了賦值操作。

另一方面,沒有報錯Uncaught ReferenceError:ooo is not defined;也是能證明obj.m確實持有對Scope中的ooo的引用,也就是形成了閉包。


我看了一下你的評論,覺得我們理解的閉包概念不一樣。我認為的閉包是obj.m,而你認為的閉包是(function(obj))(obj)這個IIFE。emmm,我覺得我是對的。


查看完整回答
1 反對 回復 2019-03-16
?
達令說

TA貢獻1821條經驗 獲得超6個贊

function foo() {

    console.log(str);

}

var str = "aaaaa";

foo();

你說這段代碼輸出undefined還是aaaaa

只要調用的時候有值就行了


查看完整回答
反對 回復 2019-03-16
?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

這樣理解吧。obj.m = function(){}產生了一個閉包,因為方法體訪問了ooo的引用。那么ooo這個引用顯然是個動態的,根兒上來說就是個地址,這個地址指向的空間可能在定義obj.m的時候是個空的(undefined),但是隨著程序的執行ooo被賦值了,地址指向的空間有東西了,自然也就能打印出東西了


查看完整回答
反對 回復 2019-03-16
?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

大哥,當你執行obj.m()這個方法時,我ooo早就賦值了好嗎。

除非這樣寫


var obj = {};

(function(obj){

    obj.m = (function(){

      console.log(ooo);

    })();//這里改成自執行,這才是ooo還沒賦值, 你那個是在代碼末尾執行,我ooo已經賦了值了

    var ooo = {};

 })(obj);


查看完整回答
反對 回復 2019-03-16
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

var obj = {};//1

(function(obj){//2

    obj.m = function(){//3

      console.log(ooo);//6

    };

    var ooo = {};//4

 })(obj);

obj.m();//5


查看完整回答
反對 回復 2019-03-16
  • 5 回答
  • 0 關注
  • 536 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號