<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn">
		<id>http://wiki.tomtalk.net/index.php?action=history&amp;feed=atom&amp;title=%E7%B2%BE%E9%80%9AJavaScript%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E7%9A%84%E7%BB%86%E8%8A%82%EF%BC%9A%E5%8F%98%E9%87%8F</id>
		<title>精通JavaScript需要注意的细节：变量 - 版本历史</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.tomtalk.net/index.php?action=history&amp;feed=atom&amp;title=%E7%B2%BE%E9%80%9AJavaScript%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E7%9A%84%E7%BB%86%E8%8A%82%EF%BC%9A%E5%8F%98%E9%87%8F"/>
		<link rel="alternate" type="text/html" href="http://wiki.tomtalk.net/index.php?title=%E7%B2%BE%E9%80%9AJavaScript%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E7%9A%84%E7%BB%86%E8%8A%82%EF%BC%9A%E5%8F%98%E9%87%8F&amp;action=history"/>
		<updated>2026-05-02T00:18:46Z</updated>
		<subtitle>本wiki的该页面的版本历史</subtitle>
		<generator>MediaWiki 1.24.2</generator>

	<entry>
		<id>http://wiki.tomtalk.net/index.php?title=%E7%B2%BE%E9%80%9AJavaScript%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E7%9A%84%E7%BB%86%E8%8A%82%EF%BC%9A%E5%8F%98%E9%87%8F&amp;diff=2464&amp;oldid=prev</id>
		<title>Tom：移动JavaScript深入需要注意的细节：变量至精通JavaScript需要注意的细节：变量</title>
		<link rel="alternate" type="text/html" href="http://wiki.tomtalk.net/index.php?title=%E7%B2%BE%E9%80%9AJavaScript%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E7%9A%84%E7%BB%86%E8%8A%82%EF%BC%9A%E5%8F%98%E9%87%8F&amp;diff=2464&amp;oldid=prev"/>
				<updated>2012-08-11T08:20:38Z</updated>
		
		<summary type="html">&lt;p&gt;移动&lt;a href=&quot;/index.php?title=JavaScript%E6%B7%B1%E5%85%A5%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E7%9A%84%E7%BB%86%E8%8A%82%EF%BC%9A%E5%8F%98%E9%87%8F&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;JavaScript深入需要注意的细节：变量（页面不存在）&quot;&gt;JavaScript深入需要注意的细节：变量&lt;/a&gt;至&lt;a href=&quot;/index.php?title=%E7%B2%BE%E9%80%9AJavaScript%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E7%9A%84%E7%BB%86%E8%8A%82%EF%BC%9A%E5%8F%98%E9%87%8F&quot; title=&quot;精通JavaScript需要注意的细节：变量&quot;&gt;精通JavaScript需要注意的细节：变量&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==当javaScript从入门到提高前需要注意的细节：变量==&lt;br /&gt;
&lt;br /&gt;
到了HTML5的时代，对javaScript的要求不是降低了，而是更提高了。javaScript语言的入门非常简单，如果你有java、C#等C风格的结构化语言的基础，那javaScript你最多半天就可以写点什么了。但是javaScript是一种动态语言，这个特性决定了他在很多方面和java、C#等语言有极大的不同。很多人说只要会java、C#就可以在短时间内搞定javaScript，估计一般都是吹牛来的，用javaScript写点简单的应用没有问题，如果要完全比较好的掌握，那需要真正的理解javaScript的动态这个特性。&lt;br /&gt;
&lt;br /&gt;
当你快速的了解的javaScript入门编程后，在提高开发能力之前，需要的是确保掌握javaScript的编程细节或者说特殊性。&lt;br /&gt;
&lt;br /&gt;
而且和css在不同的浏览器中有兼容性问题一样，javaScript在不同的浏览器和版本中也同样有不同的变化。&lt;br /&gt;
&lt;br /&gt;
我认为javaScript入门之后，向中级（基于面向对象的编程）发展之前，有两个问题会对开发者有影响：类型的动态和语法的灵活性。而这两点的集合，是另很多入门级的javaScript人员造成各种诡异问题的核心。我这篇文章不讨论关于语法的基础，关于核心对象的方法，也不关心dom的处理，这些内容在网上的任何javaScript教程中都有，我们讨论一个些基于代码级别但容易写错的地方，为你将来的高质量的javaScript奠定些好的基础。&lt;br /&gt;
&lt;br /&gt;
我以下的内容是在IE7/8、Chrome14、FireFox10下进行测试。同时声明一个事情，下面的内容的次序比较随意，比javaScript还随意，不是作为一步步的教程给零基础看的。需要你至少有些javaScript的代码经验了。&lt;br /&gt;
&lt;br /&gt;
在javaScript中变量使用var声明的变量是当前作用域的变量，不使用var声明的则肯定是全局变量。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var x = 10; //全局&lt;br /&gt;
    y = 100; //全局&lt;br /&gt;
&lt;br /&gt;
    function fun1() {&lt;br /&gt;
        var m = 99; //局部&lt;br /&gt;
        n = 9; //全局&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(typeof this.x); //number&lt;br /&gt;
    alert(typeof this.y); //number&lt;br /&gt;
    alert(typeof this.m); //undefined&lt;br /&gt;
    alert(typeof this.n); //undefined&lt;br /&gt;
    fun1();&lt;br /&gt;
    alert(typeof this.m); //undefined&lt;br /&gt;
    alert(typeof this.n); //number &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上代码说明，当fun1被执行后，函数内没有用var声明的n变量，被注册为全局变量了。&lt;br /&gt;
&lt;br /&gt;
下面的代码得到同样的执行效果&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var x = 10; //全局&lt;br /&gt;
    y = 100; //全局&lt;br /&gt;
&lt;br /&gt;
    function fun1() {&lt;br /&gt;
        var m = 99; //局部&lt;br /&gt;
        n = 9; //全局&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(typeof window.x); //number&lt;br /&gt;
    alert(typeof window.y); //number&lt;br /&gt;
    alert(typeof window.m); //undefined&lt;br /&gt;
    alert(typeof window.n); //undefined&lt;br /&gt;
    fun1();&lt;br /&gt;
    alert(typeof window.m); //undefined&lt;br /&gt;
    alert(typeof window.n); //number &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
那么，我们可以明显的得到一个推理，在全局里面，window和this是同一个对象指向。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    alert(this == window);&lt;br /&gt;
    alert(this === window);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
那么下面的函数在其函数状态和对象状态时this的指向是不同的，因为javaScript的动态的执行，当其执行到的时候，才去计算上下文情况。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt; &lt;br /&gt;
    function Fo1() {&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(Fo1());&lt;br /&gt;
    alert(new Fo1()); &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
同样作为变量，使用var声明的变量是不可以删除的，没有使用var声明的变量是可以删除的&lt;br /&gt;
&lt;br /&gt;
var x = 10; //全局&lt;br /&gt;
y = 100; //全局&lt;br /&gt;
&lt;br /&gt;
function fun1() {&lt;br /&gt;
    var m = 99; //局部&lt;br /&gt;
    n = 9; //全局&lt;br /&gt;
    delete m;&lt;br /&gt;
    delete n;&lt;br /&gt;
    alert(typeof m); //number&lt;br /&gt;
    alert(typeof n); //undefined&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
delete x;&lt;br /&gt;
delete y;&lt;br /&gt;
&lt;br /&gt;
alert(typeof x); //number&lt;br /&gt;
alert(typeof y); //undefined&lt;br /&gt;
fun1();&lt;br /&gt;
alert(typeof n); //undefined&lt;br /&gt;
&lt;br /&gt;
在javaScript中声明变量非常的灵活，但这个灵活性，对控制全局和局部要有所注意。&lt;br /&gt;
&lt;br /&gt;
function fun1() {&lt;br /&gt;
    var m = n = 10; //n是全局，m是局部&lt;br /&gt;
    var x, y = 1, k = 10; //xyk都是局部&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
而且，有意思的是，在通常的语言中，我们对变量总是先定义后使用，不过在javaScript中嘛……看以下代码&lt;br /&gt;
&lt;br /&gt;
function fun1() {&lt;br /&gt;
    alert(typeof x); //undefined&lt;br /&gt;
    alert(typeof y); //undefined&lt;br /&gt;
    var x = 10;&lt;br /&gt;
    alert(typeof x); //number&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fun1();&lt;br /&gt;
&lt;br /&gt;
这样的结果，对你来说是完全可以接受和预期的，不过……&lt;br /&gt;
&lt;br /&gt;
function fun1() {&lt;br /&gt;
    alert(x); //undefined&lt;br /&gt;
    alert(y); //提示y没有定义&lt;br /&gt;
    var x = 10;&lt;br /&gt;
    alert(x); //number&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fun1();&lt;br /&gt;
&lt;br /&gt;
上面的现象很奇怪，如果我们当真要用x和y的时候，编译器却给予不同的对待，认为x仅仅是没有定义（认可已经声明了），而y是真正的不存在。这说明在处理一个范围的变量的时候，var无论你在哪里声明的，总是一开始就进行分配了。对于非var定义的变量嘛，就没有这样的待遇了，必须等执行到才进行分配&lt;br /&gt;
&lt;br /&gt;
function fun1() {&lt;br /&gt;
    alert(x); //提示x没有定义&lt;br /&gt;
    alert(y); //提示y没有定义&lt;br /&gt;
    x = 10;&lt;br /&gt;
    alert(x); //number&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fun1();&lt;br /&gt;
&lt;br /&gt;
更需要注意的是，在函数内部声明的var变量，并不局限在声明的代码语句块中，看看以下代码&lt;br /&gt;
&lt;br /&gt;
function fun1() {&lt;br /&gt;
    for (var i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    alert(i); //10&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fun1();&lt;br /&gt;
&lt;br /&gt;
所以呢，我们推荐在一个对象/函数的第一行就把所有的局部变量全部声明完毕&lt;br /&gt;
&lt;br /&gt;
function fun1() {&lt;br /&gt;
    var value = 1,&lt;br /&gt;
    arr = [],&lt;br /&gt;
     obj = {},&lt;br /&gt;
    date = new Date(),&lt;br /&gt;
    has = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意变量之间用逗号隔离,这样的好处是明显的，自己去考虑吧。&lt;br /&gt;
&lt;br /&gt;
javaScript的语法很灵活，语句后面可以不加;来表示结束，这个时候编译器会讲硬回车作为语句的结束符合&lt;br /&gt;
&lt;br /&gt;
function fun1() {&lt;br /&gt;
    var x = 10&lt;br /&gt;
    var y = 9&lt;br /&gt;
    return x + y&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
alert(fun1()); //19&lt;br /&gt;
&lt;br /&gt;
以上的代码写法我不知道有什么特别的好处，如果是炫耀你知道可以不用;来结束语句，那就到此为止吧。因为下面的代码会得到一个错误&lt;br /&gt;
&lt;br /&gt;
function fun1() {&lt;br /&gt;
    return &lt;br /&gt;
    {&lt;br /&gt;
        Title: &amp;quot;title&amp;quot;,&lt;br /&gt;
        Style: &amp;quot;style&amp;quot;,&lt;br /&gt;
        Value: &amp;quot;Value&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
alert(typeof fun1()); &lt;br /&gt;
&lt;br /&gt;
因为javaScript会再return后面加一个; 正确的做法是&lt;br /&gt;
&lt;br /&gt;
function fun1() {&lt;br /&gt;
    return {&lt;br /&gt;
        Title: &amp;quot;title&amp;quot;,&lt;br /&gt;
        Style: &amp;quot;style&amp;quot;,&lt;br /&gt;
        Value: &amp;quot;Value&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
alert(typeof fun1()); &lt;br /&gt;
&lt;br /&gt;
我不好说，这个原因一定是；不写引起的，但我想说明的是，你要小心javaScript对随意代码的随意处理：你总是应该让javaScript编译器知道你明确的要干嘛，而不是由他去猜呀猜的。&lt;/div&gt;</summary>
		<author><name>Tom</name></author>	</entry>

	</feed>