Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的。可以正常运行的代码并不代表是合适的代码。

var num = 1;

是在当前域中声明变量. 如果在方法中声明,则为局部变量(local variable);如果是在全局域中声明,则为全局变量。

而 num = 1;

事实上是对属性赋值操作。首先,它会尝试在当前作用域链(如在方法中声明,则当前作用域链代表全局作用域和方法局部作用域etc。。。)中解析 num; 如果在任何当前作用域链中找到num,则会执行对num属性赋值; 如果没有找到num,它才会在全局对象(即当前作用域链的最顶层对象,如window对象)中创造num属性并赋值。

注意!它并不是声明了一个全局变量,而是创建了一个全局对象的属性。

即便如此,可能你还是很难明白“变量声明”跟“创建对象属性”在这里的区别。事实上,Javascript的变量声明、创建属性以及每个Javascript中的每个属性都有一定的标志说明它们的属性----如只读(ReadOnly)不可枚举(DontEnum)不可删除(DontDelete)等等。

由于变量声明自带不可删除属性,比较var num = 1 跟 num = 1,前者是变量声明,带不可删除属性,因此无法被删除;后者为全局变量的一个属性,因此可以从全局变量中删除。

具体见以下代码:

复制代码代码如下:

// num1为全局变量,num2为window的一个属性

var num1 = 1;

num2 = 2;

// delete num1;  无法删除

// delete num2;  删除

function model(){

var num1 = 1; // 本地变量

num2 = 2;     // window的属性

// 匿名函数

(function(){

var num = 1; // 本地变量

num1 = 2; // 继承作用域(闭包)

num3 = 3; // window的属性

}())

}

PS. 在ECMAScript5标准中,有一种“严格模式”(Strict Mode)。在严格模式中,为未声明的标识符赋值将会抛引用错误,因此可以防止意外的全局变量属性的创造。目前一些浏览器的新版本已经支持。

转载于:https://www.cnblogs.com/liuna/p/6140901.html

js中加“var”和不加“var”的区别,看完觉得这么多年js白学了相关推荐

  1. js构造函数加括号与不加括号的区别

    //首先定义一个构造函数Hello function Hello(){ alert(1): } //定义一个函数表达式 var getName = function(){ alert(2): } // ...

  2. js中方法调用加括号和不加括号的区别

    前言 一个页面需要使用到setInterval和setTimeout.使用过程中对于方法的调用出现了加括号和不加括号的区别,当然在其他的场景也有发生,window.load = init等等 区别 以 ...

  3. js创建对象时,属性加引号与不加引号的区别(转)

    概要: 总结一下: 1. 命名要规范,变量名或者属性名不能用数字开头. 2. 可以加引号后使用,但调用要像数组中的属性那样调用  obj['888name'] 3. 符合规范的时候,加不加引号一样 以 ...

  4. Js函数加括号、不加括号

    Js函数加括号.不加括号 (function a(){}) (命名函数表达式)会返回这个函数(不会执行),但是在括号外面无法调用该函数,需要一个变量接收这个函数,var fun = (function ...

  5. html事件中写js,html标签中绑定触发事件与js中绑定触发事件写法上的区别

    html> js中方法名后加括号和不加口号的区别 按钮 var test = function(){ var span = document.createElement("span&q ...

  6. js中的typeof 与typescript typeof的区别

    js中的typeof 与typescript typeof的区别 在 JavaScript 中,typeof 是一个运算符,用于返回一个值的数据类型.它可以返回下列字符串中的一个: "und ...

  7. js中定义变量加var和不加var的区别

    这个问题其实我在面试的时候有被问到过,当时我记得我回答的很模糊,面试官看到我好像不太清楚,又问我是不是可以不加var定义变量... 正好昨天做项目的时候想到这个问题,觉得这种细节上的问题才是拉开差距的 ...

  8. html自定义属性冒号,vue中标签上的属性加冒号与不加冒号的区别

    今天vue的项目中,因为很多结构一样的条目,所以想到了使用循环.但是问题来了,每个条目的图标不一样,这就需要在循环中依次添加不同的字体图标的类名.直接使用class来操作,结果没有报错,但是图标也没有 ...

  9. Web前端笔记-js中加载图片文件(vue cli中同样适用)

    这里主要是在vue cli项目中加载图片的时候会出现304,特别是使用自己写的js加载图片的时候,此博文记录了解决办法. 在js文件中引用文件 import img from '@/assets/im ...

最新文章

  1. linux 服务搜索顺序文件 /etc/nsswitch.conf 简介
  2. Ubuntu 14.04安装mysql
  3. 总结 @ 在 C# string 中的用法
  4. 交大c语言作业答案,西安交大c语言作业及答案详解.docx
  5. 基于mysql实现的网站_[源码和文档分享]基于JavaScript和MySQL的文化平台网站的设计与实现...
  6. 看完这些干货帖,大数据产品从入门到精通
  7. js 正则 或者_如何彻底搞懂面向 Web 开发者的正则表达式?
  8. Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
  9. JavaScript文本特效实例小结【3个示例】
  10. HTTP之Cookie
  11. CUDA中并行规约(Parallel Reduction)的优化
  12. 流媒体激活宽带3G产业链 将改写传媒版图(转)
  13. 京东、京东全球购、考拉等电商平台入驻费用详解
  14. 845透色android10,和平精英TCA845透色
  15. redis incr mysql_INCR
  16. Bug heroes虫虫英雄······超详细翻译+基本攻略
  17. Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)
  18. cml sml区别_.CML与SML有何联系和区别?
  19. CCPC2018 桂林 D Bits Reverse
  20. Lua三人帮出新书 Lua Programming Gems

热门文章

  1. 计算机管理员相关知识,计算机管理员述职报告范文
  2. winform防止sqlserver注入_c# 防止sql注入对拼接sql脚本的各个参数处理
  3. frm考试可以用计算机,FRM考试,考生自己可以携带计算器吗?
  4. 无法删除计算机文件是什么意思,为何计算机的文件删除不了,说是被占用要解除占用...
  5. oracle中存储过程和函数有什么区别,Oracle中存储过程和函数的区别
  6. sqoop从mysql导入hdfs_sqoop 从mysql导入数据到hdfs、hive
  7. XHTML 语法规则及 HTML/XHTML 文档类型说明(XHTML 1.0/XHTML 1.1 和 HTML 4.01/HTML 5)
  8. 小学四年级计算机制作月历教案,四年级上册信息技术教案-1制作月历|冀教版(5页)-原创力文档...
  9. golang mysql封装_golang如何封装路由
  10. eclipes创建一个web项目web.xml不能自动更新的原因(web.xml和@WebServlet的作用)