分析以下幾種情況下的程序輸出值產(chǎn)生的原因:
程序1.
function obj(name){
if(name){
this.name = name
}
return this
}
obj.prototype.name = "name2"
var a = obj("name1")
var b = new obj
console.log(a.name) // 'name1'
console.log(b.name) // 'name2'
name = 'name3'
console.log(a.name) // 'name3'
console.log(b.name) // 'name2'
輸出分析:
obj.prototype.name = "name2"
var a = obj('name1') ;
/*直接調(diào)用obj函數(shù)
*1. this -> window
*2. 創(chuàng)建全局變量name,并賦值為'name1'
*3. a -> window
*/
var b = new obj
a.name // window.name = 'name1'
b.name // 對(duì)象實(shí)例本身不存在屬性name,返回原型對(duì)象上的name屬性值'name2'
name = 'name3' // 全局變量name被重賦值為'name3'
a.name // window.name = 'name3'
b.name // 'name2'
程序2
function obj(name){
if (name) {
var obj = {}
obj.name = name
return obj
}
}
obj.prototype.name = "name2"
var a = obj("name1")
var b = new obj
console.log(a.name) // 'name1'
console.log(b.name // 'name2'
console.log(name) //undefined
name = 'name3'
console.log(a.name) // 'name1'
console.log(b.name) // 'name2'
console.log(name) // 'name3'
輸出分析:
obj.prototype.name = "name2"
var a = obj('name1') ;
/*直接調(diào)用obj函數(shù)
*1. 創(chuàng)建對(duì)象obj
*2. obj.name = 'name1'
*3. a -> obj
*/
var b = new obj
a.name // obj.name = 'name1'
b.name // 對(duì)象實(shí)例本身不存在屬性name,返回原型對(duì)象上的name屬性值'name2'
name // 創(chuàng)建全局變量
name = 'name3' //window.name = 'name3'
a.name //obj.name = 'name1'
b.name // 'name2'
程序3
var x = 'a'
function printX() {
console.log(x) // undefined
var x = 'b'
console.log(x) // 'b'
}
printX()
var y = 'c'
function printY() {
console.log(y) // 'c'
y = 'd'
console.log(y) //'d'
}
printY()
輸出分析:
//聲明提升
var x = 'a'
function printX() {
var x
console.log(x) // undefined
x = 'b'
console.log(x) // 'b'
}
程序4
function foo(a){
var a;
return a;
}
function bar(a){
var a = 'bye';
return a;
}
[foo('hello'),bar('hello')] // ['hello','bye']
輸出分析:
// 解析foo('hello')執(zhí)行過程:
function foo(){
var a
var a
a = hello
return a
}
// 解析bar('hello')執(zhí)行過程:
function bar(){
var a
var a
a = "hello"
a = 'bye'
return a
}