From Learn About the Ext JavaScript Library

Summary: 本教程讲解了Javascript中的作用域(scope)几个要点和变量可见度(variables visibility)等的问题。

Author: Jozef Sakalos(译者:Frank Cheung)

Published: August 27, 2007

Ext Version: 1.1+ / 2.0+

page_edit.png 事前准备

学习本教程的最佳方法是随手准备好Firefox中的工具Firebug。这样使得您可以即刻测试教程的例子。

如果机子上还没有FireFox和FireBug,就应该尽快安装一套来用。

page_edit.png 定义

作用域scope

1.(名词)某样事物执行、操作、拥有控制权的那么一个区域 [1]

2. (名词) 编写程序时,程序之中变量的可见度;例如,一个函数能否使用另外一个函数所创建的变量。[2]

可是这能够说明什么问题呢? 每当有人在说“这是作用域的问题”或“作用域搞错了”的时候,那就是说某个函数运行起来的时候,找不到正确变量的位置。这样我们便知道应该从哪一方面入手,查找出问题所在。

page_edit.png 正式开始

实际上每一个你定义的函数都是某个对象的方法。甚至是这样的写法:

function fn() {

alert(11);

}

老兄你不是故弄玄虚吧~。做一个这样的演示可真得是简单得要命。没错!本例不需要任何Javascript文件,服务器或html。你只要打开firefox,弹出firebug,点击console tab。在Firefox状态栏上面看到有>>>提示的地方就可以输入了。

输入:

function fn() { alert(11); };

然后回车。一切安然...你刚才做的实际上是定义了一个函数fn。接着试试:

fn();

然后回车。得到11的警告窗口?还不错吧?接着试试:

window.fn();

this.fn();

得到一样的结果吧?这是因为函数fn是window对象的一个方法,在第二行的"this"的作用域实际指向了window对象。不过多数情况中你不需要像这样window.myFunction(...)地调用函数,这样太麻烦了,程序员工作起来会很不方便。

page_edit.png window对象

window 对象总是存在的,你可理解其为一个浏览器窗口对象。它包含了其它所有的对象如document 和所有的全局变量。

你可以打开Firebug,切换到 Script 页面并在Firebug右侧的New watch expression... 里面输入 window。观察window对象究竟有什么在里面。

接着,尝试找出我们之前定义过的fn函数。

另外,每个frame或iframe拥有其自身的window对象,其自身的全局空间。

page_edit.png 理解作用域

接下的内容开始有点复杂了。切换到Firebug Console标签页然后输入:

var o1 = {testvar:22, fun:function() { alert('o1: ' + this.testvar); }};

var o2 = {testvar:33, fun:function() { alert('o2: ' + this.testvar); }};

结果是什么?你声明了o1 和 o2两个对象,分别都有一些属性和方法,但值不同。

接着试试:

fun();

window.fun();

this.fun();

出错了,是吧?因为window对象(等价于this)并没有fun的方法。试一试下面的:

o1.fun();

o2.fun();

22和33出来了?非常好!

接下来这部分的内容最复杂啦。基于这个原始的函数,如果对象的数量多的话,你必须为每个对象加上这个函数-明显是重复劳动了。这样说吧,o1.fun写得非常清晰的而且为了搞掂它已经占用了我一个星期的开发时间。想象一下代码到处散布着this变量,怎么能不头疼?如果要将调用(执行)的o1.fun方法但this会执行o2,应该怎么实现呢?试一试下面的:

o1.fun.call(o2);

明白了吗?当执行o1的fun方法时你强行将变量this指向到o2这个对象,换句话说,更加严谨地说:o1.fun的方法在对象o2的作用域下运行。

当运行一个函数,一个对象的方法时,你可将作用域当作this值的变量。

page_edit.png 变量的可见度

变量的可见度和作用域的关系非常密切。我们已经了解到,可在任何对象的外部,声明变量,或在全局的函数(函数也是变量的一种)也可以,更严格说,它们是全局对象window的属性。 全局变量在任何地方都可见;无论函数的内部还是外部。如果你在某一个函数内修改了一个全局变量,其它函数也会得知这个值是修改过的。

对象可以有它自己的属性(像上面的testvar),这些属性允许从内部或是外部均是可见的。试:

alert(o1.testvar); // 从外部访问o1的属性testvar

从内部访问的演示可在两个测试对象的fun方法找到。

用关键字var在内部声明,相当于声明局部变量(局部声明也是在一条链上,即Scope Chain 作用域链上,Frank注):

i = 44;

function fn2() {

var i = 55;

alert(i);

}

fn2();

将得到什么?对了,55。声明在函数fn2的变量i是一个本地变量(局部变量),和等于44的全局变量i 44没什么关系。 But:

alert(i);

这会访问全局变量i,显示44。

希望本文能帮助读者彻底理解作用域变量可见性的含义。

延伸阅读:

java scope是什么意思_Tutorial:Javascript中的作用域(scope)是什么?(一)(试用FIREBUG了解)...相关推荐

  1. JavaScript中的作用域,闭包和上下文

    深入理解JavaScript中的作用域和上下文 很多语言当中都会有作用域的概念,它会给我们带来便利,偶尔也会有烦恼,只有清楚地理解和掌握了它,才能更好地为我所用,今天就带来这么一篇文章供大家参考. 介 ...

  2. javascript中关于作用域和闭包

    列表项目 前言 学习了javascript已经很久了,关于这个语言中的这两个特性也是早已耳熟能详,但是在实际的使用的过程中或者是遇到相关的问题的时候,还是不能很好的解决. 因此我觉得很有必要深入的学习 ...

  3. JavaScript 中的作用域(scope)是指什么?

    解释: 作用域Scope是你代码中的变量(variable),函数(function)和对象(object)在运行时(runtime)的可访问性(accessibility).换句话讲,作用域Scop ...

  4. java+script+当前日期_如何在JavaScript中获取当前日期?

    如何在JavaScript中获取当前日期? #1楼 您可以使用扩展了 Date对象的Date.js库,从而可以使用.today()方法. #2楼 如果您想对日期格式进行更多的粒度控制,我强烈建议您查看 ...

  5. Java生成pgp密钥对_在Javascript中生成PGP密钥对,并使用加密的PGP私钥对文本进行签名...

    我写的东西是 needs to do electronic signatures. 有些用户会像我这样的极客,并且已经拥有自己的PGP密钥.大多数人不会,也不会想要安装或维护它. 作为一种解决方案,我 ...

  6. java scri p t_深入浅析JavaScript中数据共享和数据传递_javascri

    数据共享和数据传递是相辅相成的,我们一起来讨论这个问题.首先要说的是共享和传递都是有作用域的.作用域就是起作用的区域,在同一个作用域数据可以共享,超过这个作用域就是跨作用域,就得用到数据传递了. 作用 ...

  7. java 格式化 浮点数_如何在javascript中格式化浮点数?

    回答(13) 2 years ago 我猜的关键是首先正确地向上舍入,然后你可以将它转换为String . function roundOf(n, p) { const n1 = n * Math.p ...

  8. javascript中函数作用域和声明提前

    javascript不像java等其他强类型语句,没有块级作用域(括号内的代码都有自己的作用域,变量在声明它们的代码段之外不可见)一说,但有自己的独特地方,即函数作用域. 函数作用域:变量在声明它们的 ...

  9. javaScript中变量作用域

    作用域是程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript采用词法作用域(lexical scoping),也就是静态作用域. 转载 ...

最新文章

  1. 键桥通讯布局大数据 9.45亿入股上海即富
  2. 一个封装的使用Apache HttpClient进行Http请求(GET、POST、PUT等)的类。
  3. 用Delphi开发OPC客户端工具的方法研究
  4. 大数据集群某节点彻底损毁后重装系统恢复(持续更新中)
  5. scikit-learn:通过Non-negative matrix factorization (NMF or NNMF)实现LSA(隐含语义分析)...
  6. 每日一题——王道考研2.2.4.1
  7. redis 缓存有效期
  8. Json学习总结(3)——Jsonp跨域及Rest接口实现
  9. Ribbon客户端负载均衡
  10. 大型网站架构技术的核心价值是随网站所需灵活应对
  11. u8 和 char如何转化_算法:如何实现大正整数相加?
  12. ACDSee15软件
  13. 本来共享的计算机突然无法访问,WIN7局域网无法启用共享访问解决办法
  14. 1 密码学的发展历程
  15. 毕设/私活/bigold必备项目,一个挣钱的免费的全开源标准前后端分离后台管理权限系统【springboot+vue+redis+Spring Security】脚手架搭建:若依Ruo框架具体使用教程
  16. android 多版本打包后微信分享/登录授权失败问题
  17. Adobe Photoshop 2021 for Mac 或于2021年1月份发布 PS 2021新功能一览
  18. linux如何把文件大小改为0,关于文件系统:Linux删除大小为0的文件
  19. 0x01A686F0 处有未经处理的异常(在 五金上色软件.exe 中): 0xC000041D: 用户回调期间遇到未经处理的异常。。...
  20. C语言猜数字游戏实现

热门文章

  1. 社保只交15年就行?国家白给的羊毛怎么能不薅?
  2. Life feelings--6--有一天感到没有动力了怎么办?--怎样找到持久的热情?
  3. mDNS实现之Bonjour与Avahi(一)——win/linux/arm交叉编译
  4. [廖雪峰python教程列表生成器练习]杨辉三角定义如下,把每一行看做一个list,试写一个generator,不断输出下一行的list
  5. a as as big rat_亲子阅读《Big,bad bug》大坏虫
  6. Java解析XML的一些个人总结及感悟。(webService、xml、xsd)
  7. Server Tomcat v8.5 Server at localhost was unable to start within 45 seconds. If the server requir报错
  8. 利用马青公式输出π的后任意位数字
  9. 美林数据“智能反窃电分析应用”荣获大数据星河奖
  10. 4G物联卡跟NB物联卡有什么区别