JS中變量名和函數名重名


var a=100;
function a(){
  console.log(a);
}
a();// a is not a function

 原來

  1. 函數聲明會置頂
  2. 變量聲明也會置頂
  3. 函數聲明比變量聲明更置頂
  4. 變量和復制語句一起書寫,在js引擎解析時,會將其拆成聲明和賦值兩個部分,聲明置頂,賦值保留在原來的位置
  5. 聲明或的變量不會重復聲明

實際上這段代碼等同於

var a; //函數聲明
var a; //變量聲明(實際上這里不會重復聲明了)
a = function(){ console.log(a); }; //函數賦值
a = 100;//變量賦值(給a重新賦值了)
a()//a is not a function

而如果代碼會如下寫法則a方法會執行

var a; //函數聲明
var a; //變量聲明(實際上這里不會重復聲明了)
a = 100; 
a=function(){console.log(123)}//函數賦值
a()//123 

  一道有意思的題目

function Foo() {
  getName = function () { alert (1); }; //運行這個函數重新賦值了 getName
  return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}

//請寫出以下輸出結果:
Foo.getName();   // 3
getName();  // 4                  
Foo().getName();  // 1      
getName();   // 1         
new Foo.getName();   // 2        
new Foo().getName();    // 3    
new new Foo().getName(); // 3

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM