Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 即使“this”是“undefined”,在严格模式下函数中如何定义“alert”?_Javascript_Html - Fatal编程技术网

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"