javascript - 为什么 `this` 指的是全局对象?

标签 javascript backbone.js coffeescript marionette

我有一个 Backbone Marionette 应用程序,其模块定义如下。当我运行这个应用程序时,控制台日志语句打印出 @ 作为窗口对象。当 list 方法运行时,我认为 this (@) 会引用 List.Controller 对象.我错过了什么?

###
The Header list controller.
###
define [
    'cs!app',
    'cs!./view',
    'cs!modules/header/entities'
], (
  App,
  View
) ->
  App.module 'Header.List', (List, App, Backbone, Marionette, $, _) ->
    List.Controller =
      list: ->
        console.log(@)
        headers = App.request 'header:entities'
        view = new View.Headers {collection: headers}
        App.headerRegion.show view

      setActiveHeader: (headerUrl) ->
        headers = App.request 'header:entities'
        header = headers.find (header) -> (header.get 'url') == headerUrl
        header.select()
        headers.trigger 'reset'

    App.commands.setHandler 'header:setActive', (headerUrl) ->
      List.Controller.setActiveHeader headerUrl

  App.Header.List.Controller

更新

这是调用列表方法的模块:

###
The Header module.
###

define [
    'cs!app',
    'cs!./list/controller'
], (
  App,
  listController
) ->
  App.module 'Header', (Module, App, Backbone, Marionette, $, _) ->
    Module.startWithParent = false

  App.module 'Routers.Header', (ModuleRouter, App, Backbone, Marionette, $, _) ->
    class ModuleRouter.Router extends Marionette.AppRouter
      appRoutes: {}

      executeAction = (action, args) ->
        action(args)

      API =
        list: ->
          executeAction listController.list

      App.Header.on 'start', ->
        API.list()

      App.addInitializer ->
        new ModuleRouter.Router {listController: API}

  App.Header

最佳答案

问题是使用window(全局)上下文调用对象listController 的方法list

发生这种情况是因为您以这种方式调用方法:executeAction listController.list 并且从 executeAction 这只是调用方法的正常方式:action(args)

您可以将方法绑定(bind)到类(使用_.bind)或使用 callapply js Function(绑定(bind)方式更简单):

绑定(bind) (_.bind(action, context):

executeAction _.bind(listController.list, listController)

调用(或应用)另一个上下文(method.call(context, arg1, ..)method.apply(context, argsArray))

  executeAction = (context,action, args) ->
    action.call(context, args)

  API =
    list: ->
      executeAction listController, listController.list

关于javascript - 为什么 `this` 指的是全局对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20537486/

相关文章:

javascript - 如何使用 dagre d3.js(javascript 库)向有向图添加点击事件?

backbone.js - Busterjs+requirejs+backbone 怎么写测试?

javascript - RequireJs 导出 Handlebars 模板

coffeescript - 定义一个函数并立即在Coffee中调用它,得不到想要的结果

javascript - 尝试在类似类的 javascript 中使用 Angular ngTable

node.js - 在 nodeJS 中运行 Mocha 测试时出错

javascript - 更改包含 div 的 div 的背景

javascript - Localstorage 选择 Javascript - 保存样式 CSS

javascript - 主干JS : is there a list of default events one can bind to?

如果所有输入均为 true,Javascript 错误代码验证错误边框框将隐藏