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 相关文章推荐
js滚动条多种样式,推荐
Feb 05 Javascript
Javascript毫秒数用法实例
Feb 05 Javascript
基于jquery实现三级下拉菜单
May 10 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
May 19 Javascript
详解Vue 方法与事件处理器
Jun 20 Javascript
vue之将echart封装为组件
Jun 02 Javascript
Vue2.x Todo之自定义指令实现自动聚焦的方法
Jan 08 Javascript
vue-router命名视图的使用讲解
Jan 19 Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
Sep 05 Javascript
js实现图片跟随鼠标移动效果
Oct 16 Javascript
原生javascript制作的拼图游戏实现方法详解
Feb 23 Javascript
微信小程序scroll-view的滚动条设置实现
Mar 02 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
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
javascript 年月日联动实现核心代码
2009/12/21 Javascript
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
Javascript 中创建自定义对象的方法汇总
2014/12/04 Javascript
jQuery选择器源码解读(五):tokenize的解析过程
2015/03/31 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
js中作用域的实例解析
2017/03/16 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
深入理解Vue keep-alive及实践总结
2019/08/21 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
Python实现简单的可逆加密程序实例
2015/03/05 Python
python实现解数独程序代码
2017/04/12 Python
python中requests小技巧
2017/05/10 Python
python pygame实现2048游戏
2018/11/20 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
django正续或者倒序查库实例
2020/05/19 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
澳大利亚正品化妆品之家:Cosmetic Capital
2017/07/03 全球购物
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
大课间活动实施方案
2014/03/06 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
三严三实心得体会范文
2014/10/13 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android
TS 类型兼容教程示例详解
2022/09/23 Javascript
使用python生成大量数据写入es数据库并查询操作(2)
2022/09/23 Python