2个js 基础问题

Question 1
function bar(){
    //....
}

在chrome 环境下:

console.log(this.bar)//此时会显示bar函数
console.log(window.bar)//此时会显示bar函数

所以可以看作bar绑定到了window上.


那么:
在node环境下:

console.log(this.bar)//undefined
console.log(global.bar)//undefined

此时bar被绑定到了什么上面?

Question 2
var obj = {};
console.log(obj.a)//undefined

正常情况下,这里应该会报obj.a is not defined.
实际上这里执行这段代码是给了obj一个a的属性,并将值赋值为undefined.

这是我在一本书中看到了,突然一下不记得答案了.
我记得,这里是一个对象的bug,所以必须这样去处理.

在这里我想知道,这个bug是什么

阅读 3.4k
7 个回答

Node.js那个有人回答的挺好的就不说了,在CHROME下全局叫window,而在node.js下全局叫global。
在JS中,undefined和undeclared是两回事,如果声明过一个变量但还未赋值,那它是“未定义”的,而一个变量未曾声明就调用,那它是“未声明”的。
一般来说报错:referenceError: xx is not defined会让人误解为变量是undefined,而实际上更准确来讲它是undeclared的。
而不管是undefined还是undeclared,typeof的处理方式都是返回undefined

对于第二个问题,我在Chrome下面测试,看起来好像obj并没a这个属性

clipboard.png

首先感谢你们的回复,谢谢!

前段时间看这个问题的回复时,已看懂第一个问题。但第二个问题,总感觉你们的答案都有点文不对题的意思。给我的答案大概是2个意思,一个是 undefinedundeclared 的区别,另一个就是 obj.a 不会报错, obj.a.b 会报错。然后我的问题并不是这2个意思。

在Google搜索了这个问题,没找到问题的答案,但找到了这个问题真正应该叫什么--为什么js查找不存在的属性不会报错。运用你们的话来说,即为什么 obj.a 不会报错。

找到了问题真正的称呼,然后在Google的帮助下,找到了这个bug是什么.

-
如果 js 这样设置,obj.a 会报 obj.a is not defined ,即报错。
那么在对象属性赋值这种情况下:

var obj = {};
obj.a = 1;

obj.a = 1 这里执行了2步操作,第一步是 RHS(right-hand-side右查找) 查找 obj.a,第二步是赋值为1.
因此,在这里的第一步,就会报错,所以会导致对象属性赋值失败。

若有异议,欢迎指出!谢谢!

回答一下第二个问题:JS运行环境分严格模式,和 普通模式 在两种情况下是不一样的

问题1

在node环境中,一个js文件最顶层的this指向的是modules.exports,你可以通过exports.bar = bar观察到。而没有赋值给exports的,自然不会在this看到。
而global也没有,与node上下文以及写法有关。上下文可以参考这个
以及写法这三者的区别。

function d() {
    var a = 1
    function b() {}
    c = 2
}

问题2

undefined是一个合法的javascript的值,所以自然不会报error。

但如果obj是undefined的话,取obj.a就会报错,因为一个undefined不可能有一个a属性。

请认真区别null和undefined 本身这两者的设计出发点就不一样 同时 系统不存在赋值为undefined这种说法 也不要在开发中手动赋值

Question 1

clipboard.png

Question 2

正常情况下就是undefined

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题