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. 仓库管理常见问题及价值
  2. java date oracle_java对象属性为date oracle数据库字段为Timestamp 处理方式
  3. 开发工具:IDEA 调试技巧,非常实用,欢迎收藏!
  4. 天猫、京东双11销售总额超8894亿!媒体:双11成交额崇拜可休矣
  5. python重新启动整个脚本_每次对脚本进行更改时,都需要在终端中重新启动python...
  6. form和ajax同时提交吗,form表单提交与ajax消息传递
  7. poj3268(Silver Cow Party)最短路
  8. 魔方机器人之下位机编程-----两种串口通信方式的比较
  9. JAVA面试个人简历模板 ——(2022年最新版)
  10. Unity Koreographer 之 音乐制作插件介绍学习,一般使用步骤介绍(包括:一般音乐游戏制作流程简绍) 一
  11. 数据结构算法常见面试考题
  12. 数学边界(数学萌芽、初等数学、高等数学)
  13. 一名合格的Web前端工程师需要具备的8项技能!
  14. 深圳中科院计算机研究所,专家人才库数据----中国科学院计算技术研究所
  15. Python 简易版贪食蛇(源代码)
  16. python协程池_python3下multiprocessing、threading和gevent性能对比—-暨进程池、线程池和协程池性能对比 | 学步园...
  17. Laravel第三方登录开发之实现QQ登录
  18. Ardunio开发实例-ENC28J60以太网模块实现Web服务器
  19. Acala TC4 糖果节历程总结
  20. 王者荣耀服务器不稳定,王者荣耀延迟460?可能是这六个原因导致的

热门文章

  1. php怎么设置网站的字符编码,php如何设置字符编码
  2. Android 数据库 哪个好,目前最好用的安卓数据库,DBFlow使用详解
  3. e.html5.qq.com,QQ群官网-开放能力
  4. java随机整数_java如何产生1-8的整数随机数?
  5. PHP的html实现xpath解析,php用xpath解析html的代码实例讲解
  6. java socket 线程池_java socket编程的一个例子(线程池)
  7. mysql范式与反范式_MySQL 三种范式以及反范式 | 剑花烟雨江南
  8. python3中的int类型占64位,有没有什么办法来强制Python来使用64位整数的Windows?
  9. Java包装类与基本数据类型的自动 手动装箱与自动 手动拆箱
  10. php 分布式数据库查询,分布式数据库 · Thinkphp5.0完全开发手册 · 看云