sublime 运行js文件window is not defined

sublime 运行js文件window is not defined

一、前言

之前有过一个疑惑是,在sublime text中运行js代码,如果其中代码用到window、document对象 当点击ctrl+b运行的时候,控制台会提示window is not definedwindow is not defined,但是相同的代码在浏览器的console的控制台运行就没问题,之前只是在测试的时候用到,所以没有怎么在意,但是今天又遇到了,所以,必须得搞清楚了。

二、问题

代码如下:

function Cat(name) {
     this.name = name;
}

Cat.prototype.sayCatName = () => {
console.log(this === window); // => true
return this.name;
};

const cat = new Cat('Mew');
cat.sayCatName(); // => undefined

sublime-text3控制台运行结果:

谷歌浏览器控制台运行结果

三、原因分析

因为在我们的sublime-text中,这里的运行的实际环境是是运行的 node.js,问题就是出在这里,因为 在我们代码中的 window,是属于浏览器环境中的全局变量,在 node.js环境中是读取不到的,所以程序运行出错。

通常我们所说的全局变量是执行环境顶层对象的属性。浏览器的顶层对象是windows对象,在node.js中,顶层对象叫做global,变量作用域的工作方式也不一样。window对象包含了很多属性,包括对象,方法(onload,onresize,alert,close….),DOM元素(document、frames…..)以及其他变量,所有这些属性使用语法window.property来访问。

window.onload=function(){
     window.alert('i am cjc');
  }

node.js的顶层对象叫做global。由于node.js是网络服务器而不是浏览器,其中可用的函数和属性是很不一样的。

当浏览器中的JavaScript检查全局变量是否存在的时候,它是在window对象上查找的。

以上的代码中,我们可以把window改成 global,那么运行就不会出错。

 function Cat(name) {
     this.name = name;
}

Cat.prototype.sayCatName = () => {
console.log(this === global); 
return this.name;
};

const cat = new Cat('Mew');
cat.sayCatName(); // => undefined