Javascript 链式作用域

其实对于Javascript链式作用域的描述,包括,JS权威指南,都有些太冗长了--但是很准确:JavaScript中的函数运行在他们被定义的作用域里,而不是他们被执行的作用域里。
这句话有点难懂,但程序的设计,基本都是为了简单,便于理解的。记住JS中经典的一句话是,一切皆对象。
说白了链式作用域,其实就是Javascript的一个特性:子函数中可以访问父函数的所有变量。当然也包括全局变量window(一般的函数定义function a(){},其实都是window对象的子函数)。另外补充一下,函数定义有两种方式,其实略有差别:
var a=function(){}和function a(){},
稍后再解释他们的区别。
所以,我们看Crockford的<<Javascript语言精粹>>中就提到,要在一个函数中定义变量,要养成良好的习惯,请直接在函数开头定义变量。JS中这点上有别于其它语言的要求----尽量推迟变量定义(使用前定义)。
我们看一下laruence提供的例子:
var name = 'laruence';
functionecho(){
alert(name);
var name = 'eve';
alert(name);
alert(age);
}
echo();
这个例子其实很有迷惑性(会让人错误的以为,输出结果是:laruence,eve,error;其实结果是:undefined,eve,error),关键就是因为echo()函数中定义的var name='eve'。但其实换个写法,这个例子就很清楚了:
var name = 'laruence';
function echo() {
var name;
alert(name);
name = 'eve';
alert(name);
alert(age);
}
echo();
其实,上面的函数在JS引擎解析的时候,就会被解析成这样。如果你是初学者,其实这样理解就可以了。但如果你有别的程序的编程经验,例如java。就很容易被惯用思维给套住了,PS:本人就是给套住的一个。所以,还是按照Crockford的建议把,定义变量,请在函数顶部!!
还记得之前的问题吗?
var a=function(){}和function a(){}的区别。
它们的区别还变量的定义比较类似。一切皆对象。
他们两个在函数调用时,基本是等价的,但如果调用函数,在定义函数前就会有问题了。其实区别在于等号和function关键字。
var和function定义在预编译的时候被提前,var只是占位,具体赋值要等到JS引擎执行到这行。而function定义会在JS引擎预编译阶段就被直接放入到调用对象中。
还是要举例:
例子一:
alert( echo );//function echo(){return 1;};
function echo(){return 1;};
alert( a );//undefined
var a=function(){return 1;};
所以,函数的定义也可以引申出一句话,请将函数定义放在顶部(先定义后调用)!!
其实还是习惯的问题,JS中一些代码的优良习惯有别于其它语言。建议大家读一下<<Javascript语言精粹>>。在开始学习一门语言时,最好从欣赏优秀的代码开始。而JS中,大家都喜欢用一系列充满迷惑性的代码来加深自己的理解,这其实是一个误区。
另外说一点,this关键字,laruence的解释很简洁到位:"谁调用,谁就是this"。英文版更详细一点:“In JavaScript this always refers to the “owner” of the function we're executing, or rather, to the object that a function is a method of. ”,中文解释:“在JavaScript中,this永远引用我们所执行函数的拥有者,更准确的说,this引用一个函数的方法对象”。
看看下面的例子,也是误导人的:
function a(){
g_value="uk";
}
a();
alert(g_value);
其实,比较友好的写法应该是这样:
function a(){
this.g_value="uk";
}
a();//a.apply(this);
alert(this.g_value);
关于this关键字,和别的语言也有区别。首先它并不是实例的引用,而是调用它的上下文。上面例子的a(),等价于a.apply(this);
call和apply的用法是一样的,区别就在参数传递上。一个是一个一个传参数的,一个是将参数作为类数组传递的(注意这个地方是类数组)。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Javascript
# 链式作用域
# JS
# JS链式作用域详解及实例
# js实现楼层导航功能
# js获取浏览器和屏幕的各种宽度高度
# 基于JS实现移动端向左滑动出现删除按钮功能
# js实现带简单弹性运动的导航条
# javascript 网页进度条简单实例
# javascript 操作cookies详解及实例
# js实现简易垂直滚动条
# 微信小程序 引用其他js文件实现代码
# 链式
# 都是
# 是一个
# 句话
# 自己的
# 一切皆
# 他们的
# 一个函数
# 就会
# 让人
# 也有
# 会有
# 放在
# 就在
# 你是
# 结果是
# 的说
# 是这样
# 迷惑性
# 很有
相关文章:
建站主机是否等同于虚拟主机?
如何登录建站主机?访问步骤全解析
,网站推广常用方法?
如何快速辨别茅台真假?关键步骤解析
宝塔面板创建网站无法访问?如何快速排查修复?
建站主机是否属于云主机类型?
如何在景安服务器上快速搭建个人网站?
盘锦网站制作公司,盘锦大洼有多少5G网站?
网站制作免费,什么网站能看正片电影?
高端企业智能建站程序:SEO优化与响应式模板定制开发
如何在Windows服务器上快速搭建网站?
如何在Windows 2008云服务器安全搭建网站?
如何在阿里云高效完成企业建站全流程?
股票网站制作软件,网上股票怎么开户?
建站之星如何保障用户数据免受黑客入侵?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站主机无法访问?如何排查域名与服务器问题
,南京靠谱的征婚网站?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
如何用y主机助手快速搭建网站?
北京专业网站制作设计师招聘,北京白云观官方网站?
建站之星安装后如何配置SEO及设计样式?
在线制作视频的网站有哪些,电脑如何制作视频短片?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
宁波免费建站如何选择可靠模板与平台?
简历在线制作网站免费版,如何创建个人简历?
C#怎么使用委托和事件 C# delegate与event编程方法
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
,想在网上投简历,哪几个网站比较好?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
已有域名和空间,如何快速搭建网站?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
建站主机与服务器功能差异如何区分?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
如何制作网站标识牌,动态网站如何制作(教程)?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
如何有效防御Web建站篡改攻击?
建站主机如何选?性能与价格怎样平衡?
建站之星收费标准详解:套餐费用及年费价格表一览
IOS倒计时设置UIButton标题title的抖动问题
C++用Dijkstra(迪杰斯特拉)算法求最短路径
建站之星安装后如何自定义网站颜色与字体?
定制建站哪家更专业可靠?推荐榜单揭晓
网站制作公司,橙子建站是合法的吗?
建站之星北京办公室:智能建站系统与小程序生成方案解析
网站app免费制作软件,能免费看各大网站视频的手机app?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
*请认真填写需求信息,我们会在24小时内与您取得联系。