`
123003473
  • 浏览: 1043368 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

var与Javascript变量隐式声明

阅读更多
在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它。

    诸如此类。这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误,这个变量被写成y了,结果相当于“隐式”声明了一个变量y,在实际编程过程中,这种错误有时比较难以发现。
除此之外,今天通过同事介绍,了解到这种“隐式声明”中的别外一个问题。
当你在当前上下文内进行这种“隐式”声明时,JavaScript引擎会先在当前上下文中寻找是否之前有声明此变量,如果没有,再到上一级的上下文中去寻找,如果一直未找到,会最后在window上声明这个变量!
比如:

view plaincopy to clipboardprint?
window. y = "hello";  
function func(){  
y = "OH, NO!!!";  
}  
func();  
alert(window.y); //#=> display "OH, NO!!!"  
window. y = "hello";
function func(){
y = "OH, NO!!!";
}
func();
alert(window.y); //#=> display "OH, NO!!!"



  

     当上下文中的任意一层有这种“隐式”定义的变量时,那么该层的该变量会被修改,而不会在window上生成一个新的变量。(这种bug也挺讨厌的,尤其是封装的比较复杂的代码)
比如:

view plaincopy to clipboardprint?
var x = "window.x";  
function a() {  
var x = "a's x";  
var b = function() {  
var c = function() {  
//no var!  
x = "c's x:";  
};  
alert("before c run,the b.x:" + x);  
c();  
alert("after c run, the b.x:" + x);  
};  
alert("a.x is:" + x);  
b();  
alert("after b function runed, the a.x is:" + x);  
};  
alert("before a run, window.x:" + x);  
a();  
alert("after a run, window.x:" + x); 
var x = "window.x";
function a() {
var x = "a's x";
var b = function() {
var c = function() {
//no var!
x = "c's x:";
};
alert("before c run,the b.x:" + x);
c();
alert("after c run, the b.x:" + x);
};
alert("a.x is:" + x);
b();
alert("after b function runed, the a.x is:" + x);
};
alert("before a run, window.x:" + x);
a();
alert("after a run, window.x:" + x);


     这里面有以下几层:window, func a, func b, func c一直作层级嵌套。window->a->b->c
window和a中,都有定义变量x,b中未定义该变量,在c中‘隐式'声明了一个x,该x最终修改了a变量的值。
牢记,在JavaScript中,声明变量,一定前面要加var .
分享到:
评论

相关推荐

    Javascript var变量隐式声明方法

    在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它。

    javascript 显示全局变量与隐式全局变量的区别

    // 隐式声明的全局变量 console.log(a); // a console.log(b); // b console.log(window.a); // a console.log(window.b); // b 在 js 中全局变量其实是global对象(window)的属性,因此两种方式声明的全局变量都...

    JavaScript的变量声明与声明提前用法实例分析

    本文实例讲述了JavaScript的变量声明与声明提前用法。分享给大家供大家参考,具体如下: JavaScript的变量声明 JavaScript的变量声明语句无论出现在何处,都会先于其他代码首先被执行。使用var关键词声明变量的作用...

    JavaScript声明变量时为什么要加var关键字

    在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它。 代码如下: var x = “XX”; y =”xxx”; 诸如此类。这有一个问题,比如说在代码中的某一行...

    javascript中局部变量和全局变量的区别详解

    javascript有两种变量:局部变量和全局变量。...而且,千万注意,javascript把隐式声明的变量总是当成全局变量来使用的。 例如: 代码如下: function myName() {  i = ‘yuanjianhang’; } myName(); function sa

    JavaScript变量声明详解

    JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性。例如: 代码如下: function test(){  myname = “huming”;  alert(myname); } test(); // “huming” alert(my...

    JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例

    但是尝试给一个未使用Var声明的变量赋值,javascript //会隐式的声明改变量,而且声明了的变量还是全局的。细节:所以大家创建变量都尽量使用Var //变量的作用域(这个问题也容易出,大家要搞明白)[removed]变量的...

    浅说js变量

    代码如下:/* 1, 变量类型: JavaScript 是弱类型, 变量可存储任意类型, 并且... 遗漏声明, 则会把变量隐式声明此变量, 并做为全局变量; (下节介绍) */ /* 3, 变量作用域: 以函数划分: 函数内部声明的变量, 只能运行的

    Web前端开发技术-认识函数作用域.pptx

    全局变量:不在任何函数内声明的变量(显示定义)或在函数内省略var声明变量(隐式定义)都称为全局变量。 作用范围:它在同一个页面文件中的所有脚本内都可以使用。 全局变量 2.全局变量和局部变量 认识函数作用域 ...

    基于JavaScript 声明全局变量的三种方式详解

    JS中声明全局变量主要分为显式声明或者隐式声明下面分别介绍。 声明方式一: 使用var(关键字)+变量名(标识符)的方式在function外部声明,即为全局变量,否则在function声明的是局部变量。该方式即为显式声明详细...

    原生javascript 学习之js变量全面了解

    1.变量的命名  ...陋习 : 没有类型 重复声明 隐式声明 不声明直接赋值 正解 : 先声明 后读写 先赋值 后运算 3. 变量类型 值类型  A) 占用空间固定 保存在栈中  B) 保存与赋值的是值本身  C) 使用typeo

    探讨JavaScript中声明全局变量三种方式的异同

    JavaScript中声明变量也是如此,很简单var(关键字)+变量名(标识符)。 方式1 var test;var test = 5;需注意的是该句不能包含在function内,否则是局部变量。这是第一种方式声明全局变量。 方式2 test = 5;没有使用...

    前端编码规范(3)JavaScript 开发规范

    如不指定 var,变量将被隐式地声明为全局变量,这将对变量难以控制。如果没有声明,变量处于什么定义域就变得不清(可以是在 Document 或 Window 中,也可以很容易地进入本地定义域)。所以,请总是使用 var 来声明...

    Javascript基础教程之变量

    大家都知道javascript是可以隐式声名变量的。但要注意,隐式声名变量总是被创建为全局变量。看以下代码,情愿javascript语言强制声明变量。建议大家一定要var声明变量。

    深入理解javascript学习笔记(一) 编写高质量代码

    一、变量 •全局变量 JavaScript的两个特征,不自觉地创建出全局变量是出乎意料的容易。... } function foo() { // 使用任务链进行部分var声明,b为隐式全局变量 var a = b = 1; } 建议: 代码如下: func

    JavaScript代码编写中各种各样的坑和填坑方法

    坑”这个字,在此的意思是“陷阱”。由于 JavaScript “弱语言”的性质,使得其在...这个我们已经非常清楚,避免造成隐式产生全局变量的方法就是声明变量尽量用 var 关键字。 可你以为用了 var 就 ok 了?来看看这个坑

    js变量以及其作用域详解

    一、变量的类型 Javascript和Java、C这些语言不同,它是一种无类型、弱检测的语言。它对变量的定义并不需要声明变量类型,我们只要通过赋值的... 二、变量的声明 JS中变量申明分显式申明和隐式申明。 var i=100;//显式

Global site tag (gtag.js) - Google Analytics