Javascript 即使“this”是“undefined”,在严格模式下函数中如何定义“alert”?
我想我们可以使用Javascript 即使“this”是“undefined”,在严格模式下函数中如何定义“alert”?,javascript,html,Javascript,Html,我想我们可以使用alert('foo')而不是window.alert('foo'),因为在浏览器上下文中,默认情况下,this=window,所以alert('foo')将自动表示this.alert('foo'),这相当于window.alert('foo') 因此,我不希望在严格模式下的函数中定义警报函数,因为启用严格模式时,此在函数中是未定义的 下面是演示我的困惑的代码 函数foo(){ console.log('----foo-----') log('this:'+this); co
alert('foo')
而不是window.alert('foo')
,因为在浏览器上下文中,默认情况下,this=window
,所以alert('foo')
将自动表示this.alert('foo')
,这相当于window.alert('foo')
因此,我不希望在严格模式下的函数中定义警报
函数,因为启用严格模式时,此
在函数中是未定义的
下面是演示我的困惑的代码
函数foo(){
console.log('----foo-----')
log('this:'+this);
console.log('window:'+window);
console.log('警报:'+警报)
console.log('window.alert:'+window.alert)
console.log('this.alert:'+this.alert)
}
功能条(){
“严格使用”
console.log('----bar-----')
console.log('this:'+this);//这是未定义的
console.log('window:'+window);
console.log('alert:'+alert)//未定义时,如何定义警报?
console.log('window.alert:'+window.alert)
console.log('this.alert:'+this.alert)
console.log('----end-----')
}
foo();
bar()代码>
我想我们可以使用alert('foo')
而不是window.alert('foo')
,因为在浏览器上下文中,默认情况下这=window
不,在JavaScript中,变量解析(技术上是标识符解析)与这个
无关。(您可能会想到Java或C#,在Java或C#中,可以使用或不使用this.
从实例方法内部访问实例成员。JavaScript的this
与Java或C#中的this
非常不同。)我们可以使用alert
或window.alert
的原因是alert
是一个全局变量
标识符解析的工作原理如下:如果标识符未在当前范围中定义,JavaScript引擎将查看最近的封闭范围,然后查看下一个最近的封闭范围,等等。全局范围是整个容器,因此全局范围在任何地方都可用(除非在给定范围中被声明隐藏)。例如:
请注意,这个
是什么并不重要
至于为什么
alert
本身(作为一个全局对象)和window
的一个属性都可用:在浏览器中,window
是一个全局变量,它引用全局对象(在全局范围的松散模式下也作为this
可用)。在ES2015之前,所有全局变量也是全局对象的属性,因此alert
是全局变量,而window.alert
是等效属性。(与您的问题不完全相关,但出于完整性考虑:在ES2015中,通过var
或函数声明创建的全局变量仍然是全局对象的属性,但也可以创建不属于全局对象属性的全局变量[使用let
、const
和class
]。但是,为web环境定义的所有标准全局变量仍然是旧式全局变量,它们也是属性。)Wait。。对于在strict mdoe中调用的函数,此
在strict中是否未定义?@PraveenKumar是的,此
在strict中是否未定义。你的观点是什么?类型错误:这是未定义的
-预期行为,对吗?@PraveenKumar是的,这是预期行为。再一次,你的观点是什么?@斜视:“这并不意味着窗口对象本身(它包含所有全局变量)……好吧,它过去是这样的,直到ES2015的let
,const
,和class
:-)现在我们有两种全局变量:一种是成为全局对象属性的,另一种不是。
// (In loose mode)
var foo = "bar";
function Ctor() {
console.log("this is window? " + (this === window)); // false
console.log(foo); // "bar"
function level2() {
console.log("this is window? " + (this === window)); // true
console.log(foo); // "bar"
}
level2();
}
var c = new Ctor();
console.log("this is window? " + (this === window)); // true
console.log(foo); // "bar"