当javaScript从入门到提高前需要注意的细节:变量部分

简介:

到了HTML5的时代,对javaScript的要求不是降低了,而是更提高了。javaScript语言的入门非常简单,如果你有java、C#等C风格的结构化语言的基础,那javaScript你最多半天就可以写点什么了。但是javaScript是一种动态语言,这个特性决定了他在很多方面和java、C#等语言有极大的不同。很多人说只要会java、C#就可以在短时间内搞定javaScript,估计一般都是吹牛来的,用javaScript写点简单的应用没有问题,如果要完全比较好的掌握,那需要真正的理解javaScript的动态这个特性。
当你快速的了解的javaScript入门编程后,在提高开发能力之前,需要的是确保掌握javaScript的编程细节或者说特殊性。
而且和css在不同的浏览器中有兼容性问题一样,javaScript在不同的浏览器和版本中也同样有不同的变化。


我认为javaScript入门之后,向中级(基于面向对象的编程)发展之前,有两个问题会对开发者有影响:类型的动态和语法的灵活性。而这两点的集合,是另很多入门级的javaScript人员造成各种诡异问题的核心。我这篇文章不讨论关于语法的基础,关于核心对象的方法,也不关心dom的处理,这些内容在网上的任何javaScript教程中都有,我们讨论一个些基于代码级别但容易写错的地方,为你将来的高质量的javaScript奠定些好的基础。


我以下的内容是在IE7/8、Chrome14、FireFox10下进行测试。同时声明一个事情,下面的内容的次序比较随意,比javaScript还随意,不是作为一步步的教程给零基础看的。需要你至少有些javaScript的代码经验了。
 

关于变量部分

在javaScript中变量使用var声明的变量是当前作用域的变量,不使用var声明的则肯定是全局变量。

 
  1. <script type="text/javascript">  
  2.  
  3.     var x = 10; //全局  
  4.     y = 100; //全局  
  5.  
  6.     function fun1() {  
  7.         var m = 99; //局部  
  8.         n = 9; //全局  
  9.     }  
  10.  
  11.     alert(typeof this.x); //number  
  12.     alert(typeof this.y); //number  
  13.     alert(typeof this.m); //undefined  
  14.     alert(typeof this.n); //undefined  
  15.     fun1();  
  16.     alert(typeof this.m); //undefined  
  17.     alert(typeof this.n); //number  
  18.       
  19.  
  20. </script> 

以上代码说明,当fun1被执行后,函数内没有用var声明的n变量,被注册为全局变量了。

下面的代码得到同样的执行效果

 
  1. <script type="text/javascript">  
  2.  
  3.     var x = 10; //全局  
  4.     y = 100; //全局  
  5.  
  6.     function fun1() {  
  7.         var m = 99; //局部  
  8.         n = 9; //全局  
  9.     }  
  10.  
  11.     alert(typeof window.x); //number  
  12.     alert(typeof window.y); //number  
  13.     alert(typeof window.m); //undefined  
  14.     alert(typeof window.n); //undefined  
  15.     fun1();  
  16.     alert(typeof window.m); //undefined  
  17.     alert(typeof window.n); //number  
  18.       
  19.  
  20. </script> 

那么,我们可以明显的得到一个推理,在全局里面,window和this是同一个对象指向。

 
  1. <script type="text/javascript">  
  2.     alert(this == window);  
  3.     alert(this === window);  
  4. </script> 

那么下面的函数在其函数状态和对象状态时this的指向是不同的,因为javaScript的动态的执行,当其执行到的时候,才去计算上下文情况。

 
  1. <script type="text/javascript">  
  2.  
  3.     function Fo1() {  
  4.         return this;  
  5.     }  
  6.  
  7.     alert(Fo1());  
  8.     alert(new Fo1());  
  9.       
  10. </script> 

同样作为变量,使用var声明的变量是不可以删除的,没有使用var声明的变量是可以删除的

 
  1. var x = 10; //全局  
  2. y = 100; //全局  
  3.  
  4. function fun1() {  
  5.     var m = 99; //局部  
  6.     n = 9; //全局  
  7.     delete m;  
  8.     delete n;  
  9.     alert(typeof m); //number  
  10.     alert(typeof n); //undefined  
  11. }  
  12.  
  13. delete x;  
  14. delete y;  
  15.  
  16. alert(typeof x); //number  
  17. alert(typeof y); //undefined  
  18. fun1();  
  19. alert(typeof n); //undefined 

在javaScript中声明变量非常的灵活,但这个灵活性,对控制全局和局部要有所注意。

 
  1. function fun1() {  
  2.     var m = n = 10; //n是全局,m是局部  
  3.     var x, y = 1, k = 10; //xyk都是局部  

而且,有意思的是,在通常的语言中,我们对变量总是先定义后使用,不过在javaScript中嘛……看以下代码

 
  1. function fun1() {  
  2.     alert(typeof x); //undefined  
  3.     alert(typeof y); //undefined  
  4.     var x = 10;  
  5.     alert(typeof x); //number  
  6. }  
  7.  
  8. fun1(); 

这样的结果,对你来说是完全可以接受和预期的,不过……

 
  1. function fun1() {  
  2.     alert(x); //undefined  
  3.     alert(y); //提示y没有定义  
  4.     var x = 10;  
  5.     alert(x); //number  
  6. }  
  7.  
  8. fun1(); 

上面的现象很奇怪,如果我们当真要用x和y的时候,编译器却给予不同的对待,认为x仅仅是没有定义(认可已经声明了),而y是真正的不存在。这说明在处理一个范围的变量的时候,var无论你在哪里声明的,总是一开始就进行分配了。对于非var定义的变量嘛,就没有这样的待遇了,必须等执行到才进行分配

 
  1. <pre name="code" class="html">function fun1() {  
  2.     alert(x); //提示x没有定义  
  3.     alert(y); //提示y没有定义  
  4.     x = 10;  
  5.     alert(x); //number  
  6. }  
  7. fun1(); 

更需要注意的是,在函数内部声明的var变量,并不局限在声明的代码语句块中,看看以下代码

 
  1. function fun1() {  
  2.     for (var i = 0; i < 10; i++) {  
  3.  
  4.     }  
  5.     alert(i); //10  
  6. }  
  7.  
  8. fun1(); 

所以呢,我们推荐在一个对象/函数的第一行就把所有的局部变量全部声明完毕

 
  1. function fun1() {  
  2.     var value = 1,  
  3.     arr = [],  
  4.      obj = {},  
  5.     date = new Date(),  
  6.     has = false;  

注意变量之间用逗号隔离,这样的好处是明显的,自己去考虑吧。
javaScript的语法很灵活,语句后面可以不加;来表示结束,这个时候编译器会讲硬回车作为语句的结束符合

 
  1. function fun1() {  
  2.     var x = 10  
  3.     var y = 9  
  4.     return x + y  
  5. }  
  6.  
  7. alert(fun1()); //19 

以上的代码写法我不知道有什么特别的好处,如果是炫耀你知道可以不用;来结束语句,那就到此为止吧。因为下面的代码会得到一个错误

 
  1. function fun1() {  
  2.     return   
  3.     {  
  4.         Title: "title",  
  5.         Style: "style",  
  6.         Value: "Value" 
  7.     }  
  8. }  
  9.  
  10. alert(typeof fun1());  

因为javaScript会再return后面加一个;
 

 

正确的做法是

 
  1. function fun1() {  
  2.     return {  
  3.         Title: "title",  
  4.         Style: "style",  
  5.         Value: "Value" 
  6.     };  
  7. }  
  8.  
  9. alert(typeof fun1());  

我不好说,这个原因一定是;不写引起的,但我想说明的是,你要小心javaScript对随意代码的随意处理:你总是应该让javaScript编译器知道你明确的要干嘛,而不是由他去猜呀猜的。



本文转自shyleoking 51CTO博客,原文链接:http://blog.51cto.com/shyleoking/803091

相关文章
|
11月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
2914 2
|
6月前
|
JavaScript 前端开发 开发者
JavaScript基础——JavaScript变量名称命名规范
JavaScript变量命名规范是编写高质量代码的重要部分。通过遵循基本规则、使用常见命名约定并应用最佳实践,可以提高代码的可读性和可维护性。希望本文能帮助开发者在日常编程中更好地理解和应用JavaScript变量命名规范,从而编写出更清晰、更可靠的代码。
309 11
|
6月前
|
JSON JavaScript 前端开发
菜鸟之路Day23一一JavaScript 入门
本文介绍了 JavaScript 的基础内容,包括 JS 的引入方式、基础语法、数据类型、运算符、类型转换、函数、对象(如 Array、String、自定义对象、JSON、BOM 和 DOM)、事件监听,以及 Vue 框架的初步使用。重点讲解了内部和外部脚本的引入、变量声明(var、let、const)、常见输出语句、数组与字符串的操作方法、DOM 操作及事件绑定,并通过实例展示了 Vue 的双向数据绑定和常用指令(v-bind、v-model、v-on、v-if、v-for 等)。
158 7
|
8月前
|
JavaScript 前端开发 容器
盘点JavaScript中所有声明变量的方式及特性
本文详细介绍了JavaScript中变量定义的多种方式,包括传统的`var`、`let`和`const`,以及通过`this`、`window`、`top`等对象定义变量的方法。每种方式都有其独特的语法和特性,并附有代码示例说明。推荐使用`let`和`const`以避免作用域和提升问题,谨慎使用`window`和`top`定义全局变量,不建议使用隐式全局变量。掌握这些定义方式有助于编写更健壮的JS代码。
143 11
|
9月前
|
JavaScript 前端开发
【JavaScript】——JS基础入门常见操作(大量举例)
JS引入方式,JS基础语法,JS增删查改,JS函数,JS对象
|
10月前
|
前端开发 JavaScript
如何在 JavaScript 中访问和修改 CSS 变量?
【10月更文挑战第28天】通过以上方法,可以在JavaScript中灵活地访问和修改CSS变量,从而实现根据用户交互、页面状态等动态地改变页面样式,为网页添加更多的交互性和动态效果。在实际应用中,可以根据具体的需求和场景选择合适的方法来操作CSS变量。
325 12
|
10月前
|
前端开发 JavaScript 数据处理
CSS 变量的作用域和 JavaScript 变量的作用域有什么不同?
【10月更文挑战第28天】CSS变量和JavaScript变量虽然都有各自的作用域概念,但由于它们所属的语言和应用场景不同,其作用域的定义、范围、覆盖规则以及与其他语言特性的交互方式等方面都存在明显的差异。理解这些差异有助于更好地在Web开发中分别运用它们来实现预期的页面效果和功能逻辑。
173 11
|
10月前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
446 10
|
10月前
|
前端开发 JavaScript UED
如何使用 JavaScript 动态修改 CSS 变量的值?
【10月更文挑战第28天】使用JavaScript动态修改CSS变量的值可以为页面带来更丰富的交互效果和动态样式变化,根据不同的应用场景和需求,可以选择合适的方法来实现CSS变量的动态修改,从而提高页面的灵活性和用户体验。
|
10月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
1329 1