var a = 5; function test() {
a = 0;
alert(a);
alert(this.a);
var a;
alert(a);
}
求 运行 test() 和 new test()的结果
test()的结果为 0 5 0
但对于 new test 的结果 本人还是不太懂 有认识的大神 可以解答一下么
var a = 5; function test() {
a = 0;
alert(a);
alert(this.a);
var a;
alert(a);
}
求 运行 test() 和 new test()的结果
test()的结果为 0 5 0
但对于 new test 的结果 本人还是不太懂 有认识的大神 可以解答一下么
当你运行 test() 时,代码等价于:
var a = 5;
function test() {
var a;
a = 0;
alert(a);
alert(window.a);//浏览器端
alert(a);
};
当你运行 new test() 时,是把 test 当作构造函数来用,这个时候,你首先要清楚 this 在构造函数中的指向问题,看测试:
function f(){
console.log(this);
console.log(this instanceof f);
}
f();// window;false;
new f();// f {} ;true
当作为构造函数来使用的时候,函数内的这个 this 就指向一个新的对象,这个对象是这个构造函数的实例,如果这个构造函数没有 return 或者 new 构造函数返回一个基本类型值的话,那这个 this 对象也是这个 new 构造函数的返回值;书上的话就是:
以这种方式调用构造函数实际上会经历以下4个步骤:
(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此this 就指向了这个新对象);
(3) 执行构造函数中的代码(为这个新对象添加属性);
(4) 返回新对象。
回来看你的问题,new test() 代码实际是这样:
var a = 5;
function test() {
var a;
a = 0;
alert(a);
alert(this.a);
alert(a);
};
let obj=new test();
当执行这句代码时:
let obj=new test();
new test() 里的 this ,指向的就是你用 new test() 所返回的对象,在这里,就是 obj ,而这个对象,你给他定义 a 属性了么?没有!所以 this.a 返回 undefined;考虑下面代码:
var a = 5;
function test() {
var a;
a = 0;
alert(a);
this.a=1;//新加
alert(this.a);//返回1,因为前面给 this.a 赋值了
alert(a);
};
let obj=new test();
console.log(obj.a);//1
最后的 log 出来的 obj.a 就证明了这个 obj 和你在 new test() 里面的 this 是同一个对象;
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
5 回答2k 阅读
主要的区别就是
this
的指向变了直接调用
test()
时,this的指向是window
或global
。使用new调用
new test()
时, this的指向变成被实例化的对象。