首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >var关键字的用途是什么?我应该何时使用它(或省略它)?

var关键字的用途是什么?我应该何时使用它(或省略它)?
EN

Stack Overflow用户
提问于 2009-09-24 08:54:04
回答 19查看 326.5K关注 0票数 1.6K

注意:__:这个问题是从ECMAScript版本3或5的角度提出的。随着发布ECMAScript 6的新特性的引入,答案可能会过时。

var关键字在JavaScript中的确切功能是什么?

代码语言:javascript
复制
var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

代码语言:javascript
复制
someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

你什么时候会使用这两种方法,为什么/它能做什么?

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2009-09-24 08:55:47

如果你在全球范围内,那就没有太大的区别了。阅读康阿克斯氏病答案以获得解释

如果您在一个函数中,var将创建一个局部变量,"no var“将查找作用域链,直到它找到变量或命中全局作用域(此时它将创建该变量):

代码语言:javascript
复制
// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

如果你没有做作业,那么你需要使用var

代码语言:javascript
复制
var x; // Declare x
票数 1.4K
EN

Stack Overflow用户

发布于 2009-09-24 13:38:36

有一个不同的

var x = 1 在当前作用域(也称为执行上下文)中声明变量 x。如果声明出现在函数中,则声明局部变量;如果声明在全局范围内,则声明全局变量。

另一方面,x = 1仅仅是一种财产转让。它首先尝试解决针对作用域链的x。如果它在该作用域链中的任何位置找到它,它将执行赋值;如果它没有找到x,那么只有才会在全局对象(它是作用域链中的顶级对象)上创建属性。

现在,注意它没有声明一个全局变量,而是创建了一个全局属性。

这两者之间的区别是微妙的,而且可能令人困惑,除非您理解变量声明也会创建属性(仅在变量对象上),并且Javascript中的每个属性(好,ECMAScript)都有描述其属性的特定标志- ReadOnly、DontEnum和DontDelete。

由于变量声明创建带有DontDelete标志的属性,所以var x = 1x = 1 (在全局范围内执行时)的区别是,前者--变量声明--创建DontDelete‘’able属性,而后者没有。因此,通过这个隐式赋值创建的属性可以从全局对象中删除,而前一个属性--通过变量声明创建的属性--不能被删除。

当然,这只是理论,而在实践中,由于实现中的各种缺陷(例如来自IE的But ),两个之间的差异更大。

希望这一切都有意义:)

更新2010/12/16

在ES5 (ECMAScript 5;最近标准化的,第5版语言)中,有一种所谓的“严格模式”--一种选择式语言模式,它轻微地改变了未声明的作业的行为。在严格模式下,分配给未声明标识符的是ReferenceError.。这样做的理由是为了捕捉意外分配,防止创建不想要的全局属性。一些较新的浏览器已经开始滚动支持严格模式。参见,例如,我的复式桌子

票数 772
EN

Stack Overflow用户

发布于 2009-09-24 09:50:34

说这是“和global”的区别并不完全准确。

最好把它看作是"local和“之间的区别。最接近的当然可以是全球性的,但情况并不总是如此。

代码语言:javascript
复制
/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}
票数 142
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1470488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档