日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一道超级复杂的js题目

發布時間:2024/4/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一道超级复杂的js题目 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先看以下代碼:

1 function Foo(){ 2 getName = function(){ alert(1); }; 3 return this; 4 } 5 Foo.getName = function(){ alert(2); }; 6 Foo.prototype.getName = function(){ alert(3); }; 7 var getName = function(){ alert(4); }; 8 function getName(){ alert(5) }; 9 10 Foo.getName(); 11 getName(); 12 Foo().getName(); 13 getName(); 14 new Foo.getName(); 15 new Foo().getName(); 16 new new Foo().getName();

?

怎么樣?是不是有點糊涂了。

首先要明確下面一些基本知識:

1、 this的指向只取決于調用的方式,,函數定義里面的this指向全局的window;

  new的過程:新建對象,讓this指向它,返回this。

  普通的函數調用時得到的值是return的返回值,new 得到值可能是this也有可能是return 的值,這取決于return后面數據的類型。

2、實例化對象訪問一個屬性的順序,先看自身有沒有這個屬性,再看訪問原型里的。
3、new 后面跟的是一個構造函數,則會創建一個對象。如果是一個構造函數的屬性名稱,那么沒有任何作用。

  ?new 只會和離他最近的()結合

請看下面的一張圖:

一開始Foo.getName()為1,第5行代碼將它修改為2,所以Foo.getName()的輸出為2;

getName() 是全局調用,函數提升優先于變量提升,到了第7行代碼getName()被修改為4,所以輸出為4;

Foo()是函數調用,得到的是return后面的值this,this指向window,并且第2行代碼將getName()修改為1,所以結果為1

同理,getName()的輸出也是為1;

new Foo.getName() new沒有任何作用,這里是方法調用,輸出值為2

new Foo().getName() new和最近的一個()結合,所以得到了一個實例化對象,實例化對象自身沒有getName這個屬性,所以訪問原型里面的getName,為 3

new new Foo().getName() 最前面的new沒有任何意義,同上一個

轉載于:https://www.cnblogs.com/liuluteresa/p/6516298.html

總結

以上是生活随笔為你收集整理的一道超级复杂的js题目的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。