Javascript学习笔记二 之 变量


Posted in Javascript onDecember 15, 2010

一.关于Javascript变量声明
在Javascript中,声明一个变量
var a=1;
也可以直接
a=1;
这两种表达是有区别的,
一个是当前作用域的局部变量,另一个则是当前作用域的全局变量;
 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 

var n=999; 
function f1(){ 
alert(n); 
} 
f1(); // 999

另一方面,在函数外部自然无法读取函数内的局部变量。
function f1(){ 
var n=999; 
} 
alert(n); // error

二.Javascript变量作用域链
var x='000 '; 
document.writeln(x); //得出'000 ' 
a(); 
function a(){ 
var x='aaa '; 
function b(){ 
document.writeln(x); //undefined 
var x='bbb '; 
document.writeln(x); //bbb 
} 
b(); 
document.writeln(x); //aaa 
} 
//结果是:000 undefined bbb aaa

原理:
 当变量使用时,先从函数块(权威指南中用调用对象来解释)中找,
 如果找不到,从上一级函数块找,直到找到,
 如果直到顶层代码(指var x='000 ';的位置)还没找到定义,代码会报未定义错误。
1.按顺序执行的顺序,输出x '000 '(这个没问题);
2.然后执行a()
3.在a()中执行b()
4.b()中需要输出x,该函数体内(作用域)有x定义,但是还未赋值,因此输出undefined;(重点!)
5.然后再输出x,x已赋值,因此输出bbb;
6.最后输出aaa;
了解了以上原理,我们来看下面的例子
var x = "global"; 
function f() { 
var x='f1'; 
function f2(){ 
x='f2' ;//这里我有些混淆,GLOBAL的X应该重新被赋值为'f2' 
alert(x); //返回"f2" 
alert(window.x); //返回"global" 
} 
f2(); 
alert(x) //返回"f2" 
} 
f(); 
alert(x); //返回"global",没有被重新赋值为:f2 
//结果分别弹出:f2 global f2 global

解释:
 首先执行f()中的f2(),
f2()为内部函数产生一个作用域,因此x=‘f2'修改的是f()中的x值,而非全局x.
alert(x);为‘f2',alert(window.x)为‘global'.
然后执行alert(x);这个x的作用域为全局,为‘global'
三.给新手的建议
1.减少全局变量(解决方案:把变量封装到对象中)
引用:
“把你踩在全局的那些乱七八糟的脚印都归于一人名下,能显著降低与其他应用、小工具或JS库冲突的可能性。”
? Douglas Crockford
var name = 'Jeffrey'; 
var lastName = 'Way'; 
function doSomething() {...} 
console.log(name); // Jeffrey -- or window.name

更好的写法
var DudeNameSpace = { 
name : 'Jeffrey', 
lastName : 'Way', 
doSomething : function() {...} 
} 
console.log(DudeNameSpace.name); // Jeffrey

注意看,我们是如何戏剧化地把“乱七八糟的脚印”都归到“DudeNameSpace”这对象之下的;
2.一长列变量声明?别写那么多var,用逗号吧
var someItem = 'some string'; 
var anotherItem = 'another string'; 
var oneMoreItem = 'one more string';

更好的写法
var someItem = 'some string', 
anotherItem = 'another string', 
oneMoreItem = 'one more string';

不言自明。我不知道这样做能否提升代码执行速度,但是确实让你的代码干净许多。
Javascript 相关文章推荐
用JavaScript实现UrlEncode和UrlDecode的脚本代码
Jul 23 Javascript
eval的两组性能测试数据
Aug 17 Javascript
jquery中通过父级查找进行定位示例
Jun 28 Javascript
Node.js异步I/O学习笔记
Nov 04 Javascript
js中日期的加减法
May 06 Javascript
ES6概念 Symbol.keyFor()方法
Dec 25 Javascript
JS实现购物车特效
Feb 02 Javascript
《javascript少儿编程》location术语总结
May 27 Javascript
JS实现页面数据懒加载
Feb 13 Javascript
vue请求数据的三种方式
Mar 04 Javascript
JavaScript实现雪花飘落效果
Dec 27 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
Feb 06 Javascript
Javascript学习笔记一 之 数据类型
Dec 15 #Javascript
iframe 父窗口和子窗口相互的调用方法集锦
Dec 15 #Javascript
jQuery Ajax使用 全解析
Dec 15 #Javascript
JQuery 应用 JQuery.groupTable.js
Dec 15 #Javascript
javascript 冒泡排序 正序和倒序实现代码
Dec 14 #Javascript
javascript中的关于类型转换的性能优化
Dec 14 #Javascript
JavaScript学习笔记之获取当前目录的实现代码
Dec 14 #Javascript
You might like
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
php简单统计在线人数的方法
2016/05/10 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
JS获取URL中的参数数据
2013/12/05 Javascript
JS不间断向上滚动效果代码
2013/12/25 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
函数window.open实现关闭所有的子窗口
2015/08/03 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
2016/09/05 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
Bootstrap 填充Json数据的实例代码
2017/01/11 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
Python实现的单向循环链表功能示例
2017/11/10 Python
python在非root权限下的安装方法
2018/01/23 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
Python3 实现串口两进程同时读写
2019/06/12 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
主办会计岗位职责
2014/03/13 职场文书
施工员岗位职责
2014/03/16 职场文书
毕业生就业协议书
2014/04/11 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
公司行政管理制度范本
2015/08/05 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL