发布于 1970-01-01 08:00
  • 2 个回答
    • forEach这个具体的例子来看,问题倒比较容易解决,毕竟

      Array.forEach(callback[, thisArg])

      里可以直接将外层的this传入,这样就解决了。

      从更一般的角度来看,以我愚见,定义一个var this_,虽然不太好看,但是在需要多次使用外层的this的时候,还是很方便的。
      如果不需要多次使用this的话,Function.bind也可以在一定程度上解决这个问题。

      想要根本上解决这个问题,也可以考虑在每个构造函数里加入类似这样的代码:

      // methodNames是一个包含所有方法名称的Array
      methodNames.forEach(function(name) {
          this[name] = this[name].bind(this)
      }, this);

      缺点是这么做会大大降低运行效率,而且也不好看。

      总的来说这是Javascript的设计上的问题,只能绕过去了。

      编辑:(感谢@zx1986的提醒)如果是用CoffeeScript的话,那么可以使用它提供的=>来定义一个保留外层this的函数:

      class Tree
        constructor: (@value, @children) ->
      
        show: () ->
          @children.forEach (child) =>
            # Note the fat arrow (=>) used here
            console.log "<Tree %s %s>", @value, child
      
      t = new Tree "root", [1, 2, 3]
      t.show()

      这个功能看起来还是不错的..

      2022-11-25 05:26 回答
    • JavaScript里面的this变量的绑定是一个历史遗留问题,具体的用法参照JavaScript: the good parts一书或者http://www.ruanyifeng.com/blog/2010/0...

      面向对象语言来说,举Java的例子:

      class Foo {
         boolean bar() {
             return this.getClass() == Foo.class;
         }
         
         class InnerFoo {
             boolean baz() {
                 return this.getClass() == InnerFoo.class;
             }
             
             boolean baz2() {
                 return Foo.this.getClass() == Foo.class;
             }
         }
      }

      bar里面的this指向的是Foo类型的对象,baz里面的this指向的是InnerFoo类型的对象,而baz2里面的Foo.this指向的是外层的Foo类型的对象,所以需要用Foo来限定。

      其实把对象本身作为参数显式的传入并不是什么bad practise,在Python中就是这样约定的:

      class MyClass:
          def __init__(self, name):
              self.name = name
              
          def greet(self, friend):
              print self.name, "says hello to", friend

      所以在JS中,需要特殊的处理this绑定的问题,比如用var that = this然后引用that就是一个常用的方法。

      函数编程里虽然没有this变量作为隐含参数传入,但是事实上是有更有效的工具的:闭包(closure)。事实上this变量可以算是闭包的一种情况。而在一些dynamic scoping的语言(如elisp)里面,函数的运行依赖于调用环境,所以“隐含的参数”其实更多。

      我个人的看法是,面向对象里面为了方便(或者强调)封装(encapsulation),把数据和操作绑定在一起,“this”的地位才如此重要。而函数编程语言中,第一公民是函数(操作)而不是数据,所以并没有this的地位。这两者是不同的思维范式,取长补短即可。

      2022-11-25 05:26 回答
    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有