1
var num=1;
function ofun(){
this.num=10;
function ifun(){
console.log(num);
var num=100;
console.log(this.num);
console.log(window.num);
}
return ifun;
}
var nf=ofun();
new nf();
输出:undefined undefined 10
分析:
var nf=ofun(); 执行ofun,返回ifun,此时this.num=10;中的this指向全局,所以改变了全局变量中的num为10。
new nf(); 将this指向了nf,而不是全局
var存在变量声明提前,所以等同于
function ifun(){
var num;
console.log(num); //声明未定义,undefined
num=100;
console.log(this.num); //this指向ifun 不存在num属性
console.log(window.num); //全局中的num已在上一步中被修改为10
}
类比:
var num=1;
function ofun(){
this.num=10;
function ifun(){
console.log(num); //undefined
var num=100;
console.log(this.num); //this指向全局 1
console.log(window.num);//1
}
return ifun;
}
var nf=new ofun(); //内部return覆盖了构造的对象
nf();
2
var a,b=3;
(function(){
console.log(a);
console.log(b);
var a=b=2;
console.log(a);
console.log(b);
})()
console.log(a);
console.log(b);
也是变量声明及作用域的问题,上述代码等同于
var a;
var b=3;
(function(){
var a;
console.log(a); //局部作用域仅声明未定义 undefined
console.log(b); //全局作用域 3
a=2; //修改的是局部变量
b=2; //修改的全局变量
console.log(a); //2
console.log(b); //2
})()
console.log(a); //全局作用域仅声明未定义 undefined
console.log(b); //全局作用域被修改未 2