为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

青春有我 2019-05-22 14:43:42
var关键字的目的是什么?我何时应该使用它(或省略它)?varJavaScript中关键字的功能到底是什么,有什么区别var someNumber = 2;var someFunction = function() { doSomething; }var someObject = { }var someObject.someProperty = 5;和someNumber = 2;someFunction = function() { doSomething; }someObject = { }someObject.someProperty = 5;?你什么时候使用其中任何一个,为什么/它做什么?
查看完整描述

4 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

如果你在全球范围内,则没有太大区别。阅读Kangax的答案进行解释

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

// These are both globalsvar 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

var x; // Declare x


查看完整回答
反对 回复 2019-05-22
?
慕村225694

TA贡献1880条经验 获得超4个赞

有区别

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

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

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

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

由于变量声明使用DontDelete标志创建属性,因此var x = 1x = 1(在全局范围内执行时)之间的区别在于前者 - 变量声明 - 创建DontDelete'able属性,后者不创建。因此,可以从全局对象中删除通过此隐式赋值创建的属性,并且不能删除前一个 - 通过变量声明创建的属性。

但这当然只是理论,实际上由于实现中的各种错误(例如来自IE的错误),两者之间存在更多差异

希望这一切都有道理:)


在ES5(ECMAScript 5;最近标准化,第5版语言)中,有一种所谓的“严格模式” - 一种选择加入语言模式,它稍微改变了未声明的作业的行为。在严格模式下,对未声明标识符的赋值是ReferenceError。其基本原理是捕获意外分配,防止产生不希望的全局属性。一些较新的浏览器已经开始支持严格模式。例如,请参阅我的compat表

查看完整回答
反对 回复 2019-05-22
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

说它是“ 本地全球 ” 之间的区别并不完全准确。

将它视为“ 本地最近 ” 之间的区别可能更好。最近的肯定是全球性的,但情况并非总是如此。

/* 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;
    }}


查看完整回答
反对 回复 2019-05-22
?
哔哔one

TA贡献1854条经验 获得超8个赞

当Javascript在浏览器中执行时,所有代码都被with语句包围,如下所示:

with (window) {
    //Your code}

有关更多信息with- MDN

由于在当前作用域中var声明了一个变量,因此在声明内部窗口和根本不声明它之间没有区别。var

当你不直接进入窗口时,例如在函数内部或块内部,就会产生差异。

使用var可以隐藏具有相同名称的外部变量。通过这种方式,您可以模拟“私有”变量,但这是另一个主题。

经验法则是始终使用var,否则您将面临引入细微错误的风险。

编辑:在收到批评后,我想强调以下内容:

  • var声明当前范围中的变量

  • 全球范围是 window

  • 不在全局范围(窗口)中使用var隐式声明var

  • 在全局范围(窗口)中使用声明变量var与省略它相同。

  • 声明在使用窗口不同的范围的变量var 是不一样的东西作为声明的变量,而不var

  • 始终var明确声明,因为这是一个好习惯


查看完整回答
反对 回复 2019-05-22
  • 4 回答
  • 0 关注
  • 780 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信