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

鍍金池/ 問答/HTML/ 幾處代碼不知是否理解正確?

幾處代碼不知是否理解正確?

function Foo(){
            getName=function(){alert(1);}
            console.log(this)
            return this;
        }
            Foo.getName=function(){alert(2);}
            Foo.prototype.getName=function(){alert(3);}
            var getName=function(){alert(4);}
            function getName(){alert(5);}
  1. Foo.getName(); //2 這里是不是因為構(gòu)造函數(shù)Foo中的getName方法沒有this關(guān)鍵字,所以就不是1,而是直接采用外部的方法,意思就是Foo對象調(diào)用getName的時候彈出2??
  2. getName(); //4
  3. Foo().getName(); //1 這里為什么是1呢?是因為Foo返回了this對象,這里的this對象是window,所以這句話的意思不是應(yīng)該等同window.getName()??那應(yīng)該是4啊為什么是1
  4. getName(); // 1 這里變成1 是不是因為3的那一步Foo返回了this對象,所以改變了全局函數(shù)getName??所以返回1
  5. new Foo.getName();//2
  6. new Foo().getName(); //3
  7. new new Foo().getName(); //3

5-7不是很理解,解釋不出原因。
5是不是new關(guān)鍵字其實沒起什么作用呢?都只是調(diào)用一個方法而已?

回答
編輯回答
野橘
Foo.getName(); //2

直接調(diào)用Foo自己的方法,而不是Foo對象的方法。Foo自己的方法是alert(2)那個,所以彈出2。

getName(); //4

這個沒什么好說的,函數(shù)聲明提升。

Foo().getName(); //1

這個就比較微妙了。仔細(xì)看Foo函數(shù),它的getName沒有用var聲明,所以這個getName實際上是window的,所以window的getName會被重新賦值。而它最后又返回了this,由于沒有用new調(diào)用,所以這里的this是window。

綜上,最終彈出的是1。

getName(); // 1

上一步把window的getName重新賦值了,所以這里彈出1。

new Foo.getName();//2

這里的new沒有任何作用。因為Foo沒有加括號,所以它實際上是先調(diào)用Foo.getName(),彈出2,然后再去new它的返回結(jié)果,也就是undefined。

new Foo().getName(); //3

這個加了括號,所以是先new一個Foo對象,再去調(diào)它的getName方法。Foo對象自身沒有g(shù)etName方法,去它的原型上去找,也就是彈出3的那個。

new new Foo().getName(); //3

最前面的new沒意義,實際執(zhí)行的時候是這樣的:new (new Foo().getName()),括號里的與前一條相同,最后的返回值為undefined,所以最前面那個new沒有實際意義。

2018年1月4日 00:24
編輯回答
嘟尛嘴

先說一下你的代碼吧,F(xiàn)oo函數(shù)中getName=function(){alert(1);}這條語句實際上是聲明一個全局變量getName,并賦值為一個函數(shù),所以函數(shù)體內(nèi)的setName既不是Foo的方法,也不是Foo中的局部變量(因為你沒有使用this,也沒有使用var)
1.Foo.getName() // Foo.getName=function(){alert(2);}這條語句給Foo添加的方法,沒問題。

2.getName(); // 這里有個函數(shù)提升,雖然function getName(){alert(5);}語句在var getName=function(){alert(4);}語句之后執(zhí)行,但是由于函數(shù)聲明具有函數(shù)提升的效果(提到作用域最前端聲明),因此getName函數(shù)被var getName=function(){alert(4);}語句重寫了。

3.Foo().getName(); // 這里就是最開始提到的,你又聲明了一個全局的getName變量,因此getName函數(shù)又被重寫了,這里就相當(dāng)于調(diào)用window.getName(),得到結(jié)果1,也沒問題

4.getName() // 由于你第三步的重寫getName()函數(shù),所以這里結(jié)果和第三步是一樣的,也是window.getName()。

5.new Foo.getName(); // 這里new關(guān)鍵字沒有任何作用,因為Foo后面沒有().
6.new Foo().getName(); // 這里比較復(fù)雜了,你需要了解js中的new關(guān)鍵字實際上都做了什么工作,這里由于你的Foo并不是一個構(gòu)造函數(shù)(沒有this.getName = ...這樣的語句),因此new返回的對象中沒有g(shù)etName()方法,但是返回對象的原型中有g(shù)etName()方法,這里就是調(diào)用了Foo原型中的getName()方法,結(jié)果為3,沒問題。

7.前面的new沒意義,實際執(zhí)行的時候是這樣的:new (new Foo().getName()),而getName()又不是一個構(gòu)造函數(shù),因此這里就相當(dāng)于調(diào)用了Foo原型中的getName()方法,結(jié)果為3,沒問題。

從你對這道題的理解來看,個人建議你多看看js相關(guān)書籍,《javascript高級教程》《javascript語言精粹》都不錯

2018年2月6日 06:30