this对象的小魔术
2017-04-13 本文已影响0人
Candy程
分析以下几种情况下的程序输出值产生的原因:
程序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') ;
/*直接调用obj函数
*1. this -> window
*2. 创建全局变量name,并赋值为'name1'
*3. a -> window
*/
var b = new obj
a.name // window.name = 'name1'
b.name // 对象实例本身不存在属性name,返回原型对象上的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') ;
/*直接调用obj函数
*1. 创建对象obj
*2. obj.name = 'name1'
*3. a -> obj
*/
var b = new obj
a.name // obj.name = 'name1'
b.name // 对象实例本身不存在属性name,返回原型对象上的name属性值'name2'
name // 创建全局变量
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')执行过程:
function foo(){
var a
var a
a = hello
return a
}
// 解析bar('hello')执行过程:
function bar(){
var a
var a
a = "hello"
a = 'bye'
return a
}