`
flare
  • 浏览: 123299 次
  • 性别: Icon_minigender_1
  • 来自: 天尽头
社区版块
存档分类
最新评论

小心使用this

阅读更多
http://www.cnblogs.com/zhengchuyu/archive/2008/07/22/1248286.html

有种流行的说法:JavaScript是基于对象和事件驱动的。应该怎样理解“基于对象”的意思呢?

《精通JavaScript》告诉我们,对象是JavaScript的基础,甚至说“JavaScript这门语言就是完全面向对象的”。



我不知道应该怎样评判这样的说法,JavaScript确实有面向对象的特性,但是他的表现形式却和其他面向对象编程语言大相径庭。





在谈JavaScript的面向对象之前,我想先说说JavaScript的作用域问题。我想只有搞清楚这个问题,才能更好地理解接下来的内容。我将会用自己的理解将JavaScript中的面向对象特性与一般面向对象程序设计语言(Java/C++等)的一些称谓对应起来。





首先理清两个问题:

1.什么是全局变量?

JavaScript中的全局变量实际上指的是window对象下的对象属性。

2.作用域划分。

JavaScript中的作用域是基于上下文,以函数进行划分的,而不是由块(block)划分的。



接下来看一个例子(原例来自《精通JavaScript》,有改动):
<script type="text/javascript">

// 设置全局变量foo,并置为“test”
var foo = "test";

if ( true )
{
    // 注意:现在还在全局作用域中
    var foo = "new test";
}

// 如我们所见,现在foo等于'new test'了
alert( foo );

// 创建一个会修改变量foo的新函数
function test()
{
    //函数内部定义变量不影响全局变量
    var foo = "old test";
    //隐式定义全局变量
    val = 'hello!';
}

// 然而在调用test函数时,foo只在函数作用域内起作用
test();

// 确认foo还是等于'new test'
alert( foo );

// 全局变量实际是window下的属性
alert( window.foo );

// 函数内部隐式定义的全局变量
alert(val);

</script>



现在你大概对JavaScript的作用域有了一个初步的理解。

要强调的两点是:

1.在同一作用域中,JavaScript是允许变量的重复定义的,并且后一个定义将覆盖前一个定义。

2.函数内部如果不加关键字var而定义的变量,默认为全局变量。




这篇blog中的例子需要引起注意的是,如果把函数修改为以下的方式结果会完全不同
function test()
{
    //函数内部定义变量不影响全局变量
   this.test = "old test";
    //隐式定义全局变量
    val = 'hello!';
}
分享到:
评论

相关推荐

    微信小程序错误this.setData报错及解决过程

    先说原因: ... 箭头函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象 箭头函数不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误 箭头函数不可以使用argumen

    stricterify:Browserify 转换以在最初没有它的模块上添加“使用严格”。 小心使用。 如果不是全球性的更好

    小心使用。 如果不是全球性的更好 概述 此转换将变成: var someFunc = function ( ) { } ; module . exports = someFunc ; 进入这个: 'use strict' ; var someFunc = function ( ) { } ; module . exports =...

    用于简单的反射对象的属性,字段,方法的方式

    不区分public和private都可以反射,请小心使用 * 4....暂时不支持泛型方法,in和out参数的方法,有好的建议可以联系我 * 5....中文注释已经比较全面 * * 有建议或者BUG可以联系:fttl_398@126.com * 所有提供建议...

    clickthis.py

    通过python的文件生成与死循环,让这些以十六进制为名字生成的文本格式的文件无限生成,致使你的电脑内存爆炸,如果不小心运行了click.py,请按ctrl+c停止终端或者立即关闭,谢谢!

    JavaScript函数中的this四种绑定形式

    【故事】有一个年轻人叫”迪斯”(this),有一天,迪斯不小心穿越到一个叫 “伽瓦斯克利”(javascript)的 异世界,此时此刻迪斯身无分文, 他首先要做的事情就是——找到他的住宿的地方——调用函数的对象 ...

    【javascript】函数中的this的四种绑定形式

    )【故事】有一个年轻人叫"迪斯"(this),有一天,迪斯不小心穿越到一个叫“伽瓦斯克利”(javascript)的异世界,此时此刻迪斯身无分文,他首先要做的事情就是——找到他的住宿的地方——调用函数的对象【故事——...

    scope-to-this-vscode:VSCode扩展的范围

    适用范围 :bullseye: 像在Visual Studio中一样,资源管理器上下文菜单中的“此范围”功能。 让您专注于重要的事情。 已知的问题 :bug: 为了确定范围,我们在settings.json配置文件中使用... 因此,在提交时要小心...

    C++编程小心指针被delete两次

    在C++类中,有时候会使用到传值调用(即使用对象实体做参数),当遇到这种情况,可要小心了!尤其是当你所传值的对象生命周期较长,而非临时对象(生命周期段)的时候。来看看下面的情况: #include using namespace ...

    VUE中setTimeout和setInterval自动销毁案例

    this._timer && clearTimeout(this._timer); } 但是如果一不小心,就会忘记,会造成意想不到的情况,那么有什么办法能避免这种情况吗? 当然有,那就是重新写一个setTimeout的方法(或者干脆劫持window.setTimeout)...

    深入浅析Vue中mixin和extend的区别和使用场景

    使用时格外小心!一旦使用全局混入,它将影响每一个之后创建的 Vue 实例。使用恰当时,这可以用来为自定义选项注入处理逻辑。 // 为自定义的选项 'myOption' 注入一个处理器。 Vue.mixin({ created: function () ...

    Wordpress回复可见插件Easy2Hide

    Sorry, only those who have replied to this site could see this words 你也可以在HTML编辑器中添加按钮,可以直接的插入隐藏标签,如下图: 这个回复可见插件,只对完全没有留言过,或者说,缓存里面没有信息...

    C++ Qt 使用信号与槽实现多窗口切换,3个窗口的切换,ABC窗口切换

    前一篇实现的是2个窗口的切换,可能很多人不一定能真正的理解信号槽在多窗口切换的操作细节,往往一不小心就会进入死胡同,导致两个界面的头文件相互包含,编译通不过;要求A界面为主界面先显示,那就得把其他界面...

    .htaccess

    虽然在服务器上使用.htaccess绝对不太可能给你带来任何麻烦(如果有些东西错了,它只是没效用罢了),但如果你使用Microsoft FrontPage Extensions,就必须特别小心。因为FrontPage Extensions本身使用了.htaccess,...

    take-this-test

    参加这个测试这是对您的音乐知识的测试,只需单击“开始”并回答问题,请小心,如果您遇到的问题是错的,则从完成测验的时间中减去15秒将被惩罚,这将为您提供得分并要求输入姓名的缩写当您输入姓名缩写时,会将您的...

    ThinkPHP3.2 集成 php-resque: PHP Resque Worker

    $interval = in_array('--interval', $this-&gt;keys) ? $this-&gt;args['--interval'] : 5; putenv("INTERVAL={$interval}"); // 根据参数设置COUNT环境变量 $count = in_array('--count', $this-&gt;keys) ? $this-&gt;...

    delims:为定界符生成正则表达式,与模板、YAML 前端、文件或数据流一起使用

    小心! 请以查看 v0.3.0 中所做的更改。 使用安装 npm i delims --save 用安装 bower install delims --save 运行测试 npm test 用法 var Delims = require ( 'delims' ) ; var delims = new Delims ( ) ; 应用...

    系统密码修改或删除

    Windows登录密码轻松破解-支持NTFS/FAT32分区(忘记密码时可以使用) 当你在使用电脑时,不小心将管理员登录密码忘记了,怎么办呢?虽然网上和各IT杂志介绍了很多种破解管理员登录密码的方法,但操作起来都比较麻烦,...

    dashboard:一个React SPA,使用ChartJS显示具有多个图表的仪表板

    对API失败的错误处理已在卡上显示“无可用数据”,因此要小心,只需测试一下就可以从数据服务中“抛出新的Error()”。如何设定这个专案, 1. Make sure that you have Node.js v8.15.1 and npm v5 or above ...

    多次注册事件会导致一个事件被触发多次的解决方法

    这是JQuery内部没有判断是否绑定多次,怀疑其内部用了数组保存事件函数,而且没有去重。 下面的代码预防了这个问题。解决方案很简单。 代码如下: if (!this.hasPageBarEvents) { ... } 以后用到JQuery要小心这个特性。

Global site tag (gtag.js) - Google Analytics