永发信息网

关于js中this

答案:3  悬赏:50  手机版
解决时间 2021-11-21 11:16
  • 提问者网友:沦陷
  • 2021-11-20 22:30
关于js中this
最佳答案
  • 五星知识达人网友:一叶十三刺
  • 2021-11-20 23:34
1.js内置对象toString()的字符串 [object Object]
alert(obj) 默认会调用toString()方法
而和你定义的类没有关系,比如:
var A={};
alert(A);// [object Object]

2.你能告诉我你使用的浏览器吗,我在IE10,chrome,firefox都是object追问var sum = new Function('alert(this)');
sum();
上面写错了,这段是新建一个function对象,为什么alert出来的是object Window而不是function对象追答这就是作用域的问题
var sum = new Function('alert(this)');
sum();
//等同于
(function(){
eval('alert(this)') ;
})();
//也等同于,前2个是动态创建
var sum=function(){
alert(this)//改作用域动态最后指向window ,为什么是动态,要说的就比较多了,上网找下js作用域
}追问我的代码不是新建了一个function对象吗?this在这个对象里,应该指向的是这个function对象吧?
var a=new Object();
a.show=function(){
alert(this)
}
a.show();
这个也是新建了一个对象,然后this就指向它了。。。。为什么后面这个就不是呢,混淆了。。追答我开始学js是这样理解的,这样比较好理解,不知道能不能帮你:)
a.show=function(){
alert(this)//这个方法是属于a对象的 所有他作用域就是a
}

var sum=function(){
alert(this)//这个方法没有所属对象,所有没有所属对象的作用域都是window
}追问那为什么这段代码,多了一个new,alert出来的就是object Object呢?
var sum = new Function('alert(this)');
new sum();
全部回答
  • 1楼网友:拾荒鲤
  • 2021-11-21 01:36
alert一个对象都是object
  • 2楼网友:七十二街
  • 2021-11-21 00:00
问题1.
这是因为alert()是比较简陋的,他只能输出字符,这导致了他并不适合我们在开发时将其作为变量输出工具。

而因为只支持输出字符,所以当你要alert()的内容不是字符串时,他会使用toString()方法强制的转化成字符串。
默认情况下,每个对象都会从Object上继承到toString()方法,如果这个方法没有被这个对象自身或者更接近的上层原型上的同名方法覆盖(遮蔽),则调用该对象的toString()方法时会返回"[object type]"
所以你在alert()这个变量a的时候,他会返回object Object,第二个object是指他是从Object对象中获取的toString()方法。

所以一般调试需要输出变量,并且看变量具体内容的话,建议使用console.log(),而不是alert()

问题2.
这是this指向的问题,当一个函数是作为对象的属性存在,当其被调用时,this会指向被绑定的对象,如非如此的话,this会指向全局对象,也就是Window。
你这里很明显,你var sum的这个操作应该不是在一个对象方法内部进行的吧?所以this会指向Window对象。而Window对象本身拥有toString()方法,所以会返回object Window追问我的代码不是新建了一个function对象吗?this在这个对象里,应该指向的是这个function对象吧?
var a=new Object();
a.show=function(){
alert(this)
}
a.show();
这个也是新建了一个对象,然后this就指向它了。。。。为什么后面这个就不是呢,混淆了。。。追答这里你理解错了,你的a.show = function() {}这个操作,其实是给对象a添加了一个自定义方法,而自定义方法作用域内的this是指向对象a的。
而你要注意的是,你声明Function的时候,this并不是在其内部呀,你是在Function()括号内使用的this呀,相当于给Function()传入this参数,而这个作用域this是在全局作用域内,所以会指向全局对象。
此外,即使是在Function()的函数体内部,this也是会指向Window对象的,不会指向function追问var sum=function(){
alert(this)
};
sum();
那这种写法,this放在里面了,但是alert出来的还是object Window哦,这又是为什么呢追答这个刚才我说过一次,给你详细的讲讲吧
this的本身定义就是,在全局函数中,this等于window,而函数作为对象的内部方法调用的时候,this指向该对象。
所以,无论是函数内部,还是函数外部,因为这个函数是全局函数,不是某个对象的方法,当时使用的时候,他都指向Window对象。只有在这个函数是某个对象的方法时,他才会指向该对象。
这个设计是因为js是一种原型设计语言,为了让他拥有一些类型设计语言的特征添加的,所以这里没有Function什么事情(而说白了,你可以理解为,你定义的所有函数,都是Window对象的方法,所以其this也会指向Window)追问那为什么这段代码,多了一个new,alert出来的就是object Object呢?
var sum = new Function('alert(this)');
new sum();追答其实这里,跟那个new Function()没有关系的,你new Function()的操作相当于创建了一个Function的实例,这跟直接执行一个匿名函数是一样的。

而这里的this在toString()后输出object Object关键点其实是在new sum()的new上,当你使用new的时候,其实是构造了一个对象(而构造的执行内容就是new Function('alert(this)')),所以这里的this就指向了构造的这个对象
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯