我有一个 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
)或使用 call
或 apply
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/