js中加“var”和不加“var”的区别,看完觉得这么多年js白学了
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白学了相关推荐
- js构造函数加括号与不加括号的区别
//首先定义一个构造函数Hello function Hello(){ alert(1): } //定义一个函数表达式 var getName = function(){ alert(2): } // ...
- js中方法调用加括号和不加括号的区别
前言 一个页面需要使用到setInterval和setTimeout.使用过程中对于方法的调用出现了加括号和不加括号的区别,当然在其他的场景也有发生,window.load = init等等 区别 以 ...
- js创建对象时,属性加引号与不加引号的区别(转)
概要: 总结一下: 1. 命名要规范,变量名或者属性名不能用数字开头. 2. 可以加引号后使用,但调用要像数组中的属性那样调用 obj['888name'] 3. 符合规范的时候,加不加引号一样 以 ...
- Js函数加括号、不加括号
Js函数加括号.不加括号 (function a(){}) (命名函数表达式)会返回这个函数(不会执行),但是在括号外面无法调用该函数,需要一个变量接收这个函数,var fun = (function ...
- html事件中写js,html标签中绑定触发事件与js中绑定触发事件写法上的区别
html> js中方法名后加括号和不加口号的区别 按钮 var test = function(){ var span = document.createElement("span&q ...
- js中的typeof 与typescript typeof的区别
js中的typeof 与typescript typeof的区别 在 JavaScript 中,typeof 是一个运算符,用于返回一个值的数据类型.它可以返回下列字符串中的一个: "und ...
- js中定义变量加var和不加var的区别
这个问题其实我在面试的时候有被问到过,当时我记得我回答的很模糊,面试官看到我好像不太清楚,又问我是不是可以不加var定义变量... 正好昨天做项目的时候想到这个问题,觉得这种细节上的问题才是拉开差距的 ...
- html自定义属性冒号,vue中标签上的属性加冒号与不加冒号的区别
今天vue的项目中,因为很多结构一样的条目,所以想到了使用循环.但是问题来了,每个条目的图标不一样,这就需要在循环中依次添加不同的字体图标的类名.直接使用class来操作,结果没有报错,但是图标也没有 ...
- Web前端笔记-js中加载图片文件(vue cli中同样适用)
这里主要是在vue cli项目中加载图片的时候会出现304,特别是使用自己写的js加载图片的时候,此博文记录了解决办法. 在js文件中引用文件 import img from '@/assets/im ...
最新文章
- linux 服务搜索顺序文件 /etc/nsswitch.conf 简介
- Ubuntu 14.04安装mysql
- 总结 @ 在 C# string 中的用法
- 交大c语言作业答案,西安交大c语言作业及答案详解.docx
- 基于mysql实现的网站_[源码和文档分享]基于JavaScript和MySQL的文化平台网站的设计与实现...
- 看完这些干货帖,大数据产品从入门到精通
- js 正则 或者_如何彻底搞懂面向 Web 开发者的正则表达式?
- Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
- JavaScript文本特效实例小结【3个示例】
- HTTP之Cookie
- CUDA中并行规约(Parallel Reduction)的优化
- 流媒体激活宽带3G产业链 将改写传媒版图(转)
- 京东、京东全球购、考拉等电商平台入驻费用详解
- 845透色android10,和平精英TCA845透色
- redis incr mysql_INCR
- Bug heroes虫虫英雄······超详细翻译+基本攻略
- Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)
- cml sml区别_.CML与SML有何联系和区别?
- CCPC2018 桂林 D Bits Reverse
- Lua三人帮出新书 Lua Programming Gems
热门文章
- 计算机管理员相关知识,计算机管理员述职报告范文
- winform防止sqlserver注入_c# 防止sql注入对拼接sql脚本的各个参数处理
- frm考试可以用计算机,FRM考试,考生自己可以携带计算器吗?
- 无法删除计算机文件是什么意思,为何计算机的文件删除不了,说是被占用要解除占用...
- oracle中存储过程和函数有什么区别,Oracle中存储过程和函数的区别
- sqoop从mysql导入hdfs_sqoop 从mysql导入数据到hdfs、hive
- XHTML 语法规则及 HTML/XHTML 文档类型说明(XHTML 1.0/XHTML 1.1 和 HTML 4.01/HTML 5)
- 小学四年级计算机制作月历教案,四年级上册信息技术教案-1制作月历|冀教版(5页)-原创力文档...
- golang mysql封装_golang如何封装路由
- eclipes创建一个web项目web.xml不能自动更新的原因(web.xml和@WebServlet的作用)