在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 請教個js執(zhí)行順序問題?

請教個js執(zhí)行順序問題?

var obj = {};
(function(obj){
    obj.m = function(){
      console.log(ooo);
    };
    var ooo = {};
 })(obj);
obj.m();//可以打印出 ooo {}

問題是這個ooo不是聲明在obj.m這個方法后面嗎,怎么可以打印出。本來以為是打印出underfined呢?

回答
編輯回答
忠妾

js的變量提升

2018年2月13日 10:51
編輯回答
心夠野

變量的聲明會被提升.

2018年5月11日 15:05
編輯回答
選擇

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

var obj = {};
(function(obj){
    obj.m = (function(){
      console.log(ooo);
    })();//這里改成自執(zhí)行,這才是ooo還沒賦值, 你那個是在代碼末尾執(zhí)行,我ooo已經賦了值了
    var ooo = {};
 })(obj);
2017年1月7日 02:37
編輯回答
懶豬

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

2017年11月26日 15:20
編輯回答
假灑脫

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

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

分析你的代碼:

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,是因為執(zhí)行obj.m();時,Scope中的ooo已經完成了賦值操作。
另一方面,沒有報錯Uncaught ReferenceError:ooo is not defined;也是能證明obj.m確實持有對Scope中的ooo的引用,也就是形成了閉包。

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

2017年7月6日 09:29
編輯回答
解夏
function foo() {
    console.log(str);
}
var str = "aaaaa";
foo();

你說這段代碼輸出undefined還是aaaaa
只要調用的時候有值就行了

2017年10月25日 19:31
編輯回答
陪我終
var obj = {};//1
(function(obj){//2
    obj.m = function(){//3
      console.log(ooo);//6
    };
    var ooo = {};//4
 })(obj);
obj.m();//5
2018年7月4日 01:44