📜  当我们直接分配变量而不在 JavaScript 中声明它时会发生什么?

📅  最后修改于: 2022-05-13 01:56:41.409000             🧑  作者: Mango

当我们直接分配变量而不在 JavaScript 中声明它时会发生什么?

JavaScript 有两个作用域,一个是局部作用域,一个是全局作用域,当我们直接分配一个变量而不声明时,它就变成了窗口对象的一个全局属性。 window 是浏览器的对象。它不是 JavaScript 的对象。它由浏览器自动创建,可以从网页的任何位置访问。

让我们在不声明的情况下为变量x赋值,并在hasOwnProperty()方法的帮助下检查变量x是否属于窗口对象。

示例 1:

Javascript
// Before x is not assigned
console.log(`1 -> ${window.hasOwnProperty('x')}`);
  
x= 2; // Assigning x without declaring it
  
console.log(`2 -> ${window.hasOwnProperty('x')}`); 
  
// To show both value refers to same object
console.log(` 3 -> ${window.x === x}`);


Javascript
function check(){
     y = "GeeksForGeeks";
}
check();
console.log(y);


Javascript
function check(){
    x = "GeeksForGeeks";
}
check();
if(window.hasOwnProperty('x')){
    console.log(`x is a Property of Window Object`);
}


Javascript
'use strict' // For strict mode
try{
    function check(){
      
        x = "GeeksForGeeks";
    }
    check();
      
} catch(err){
     
    console.log(err);
}


输出:

1 -> false
2 -> true
3 ->true

分配变量而不声明它

示例 2:在下面的示例中,变量 x 被赋值而没有声明它,因此它将成为一个全局属性并且可以从任何地方访问。

Javascript

function check(){
     y = "GeeksForGeeks";
}
check();
console.log(y);

输出:

GeeksForGeeks

我们也可以通过window.x访问这个值。所以函数check() 也可以写成如下 -

function check(){
    window.x = "GeeksForGeeks";
}

我们还可以证明,在 hasOwnProperty() 的帮助下,没有声明的赋值变成了窗口对象的属性。

示例 3:

Javascript

function check(){
    x = "GeeksForGeeks";
}
check();
if(window.hasOwnProperty('x')){
    console.log(`x is a Property of Window Object`);
}

输出:

x is a Property of Window Object

我们可以使用严格模式,这是 ECMAScript 5 中的一项新功能,它允许您将程序或函数置于“严格”操作上下文中。当我们为变量赋值而不声明它时,它会抛出引用错误:x未定义。

示例 4:

Javascript

'use strict' // For strict mode
try{
    function check(){
      
        x = "GeeksForGeeks";
    }
    check();
      
} catch(err){
     
    console.log(err);
}

输出:

ReferenceError: x is not defined
    at check (:5:11)
    at :7:5

在严格模式下分配变量