- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 CoffeScript 创建了一些 Javascript 对象。这些对象之一是实验对象:
class Experiment
@clock
@events
constructor: (@params) ->
@events = new EventsTable
@clock = 0
run: ->
setInterval ->
perform_routine
, 1000
perform_routine: ->
events = @events.get(@clock)
for event in events
if event['action'] == 'start'
console.log('an event starts.')
else
console.log('an event has been finished.')
console.log(@clock)
@clock++
每次用户单击某个按钮时,都必须创建一个实验。考虑到这一点,我实现了一个 jQuery 触发器:
$ ->
$('#start-simulation').click (event) ->
event.preventDefault();
params = {}
$('#simulation-parameters').find('input').each ->
params[$(this).attr('name')] = $(this).val();
simulation = new Experiment params
simulation.run();
问题是我总是收到 Uncaught ReferenceError :实验未定义
由于一些研究,我还尝试使用 @ 定义类名,但这样做时,我在使用类内部的方法时遇到了很多错误。
这种行为对我来说似乎完全不自然,因为我正在以正确的顺序导入所有必要的文件(第一个实验,它们是带有 jQuery 函数的文件),但这可能是由于我缺乏 javascript 经验.
你知道在 jQuery 中使用 JS 外部对象的正确方法是什么吗?
最佳答案
您有几个问题:
CoffeeScript 将您的代码包装在 SIF 中以防止范围蔓延。这:
class C
变成这样:
(function() {
var C = // the JavaScript definition of C ...
}).call(this);
SIF 包装器是为了防止 CoffeeScript 中的任何内容意外污染全局命名空间。在您的例子中,Experiment
JavaScript 变量隐藏在函数内部,因此它在任何其他 CoffeeScript 文件中都不可见。
通常的浏览器解决方案是说 class @Experiment
使您的类成为全局对象的属性。更好的解决方案是手动命名事物;在其他事情发生之前你想说的某个地方:
window.app = { } # where "app" is some namespace unique to your application
然后你可以说class app.Experiment
和new app.Experiment
。
在class
级别,@
是类本身。这意味着:
class Experiment
@clock
@events
声明了两个类属性(Experiment.clock
和 Experiment.events
),但忽略给它们赋值。这些属性不在原型(prototype)中,它们位于类函数本身中。您可能想说:
class Experiment
clock: undefined
events: undefined
如果您的目的是告诉外界 Experiment
实例具有 clock
和 events
属性。
在 CoffeeScript 中,说 f
不会调用函数 f
,它只是为您提供对 f
的引用,而无需费心将其存储在任何地方。要调用不带参数的函数,您可以说f()
。另外,如果你想调用一个方法,你需要提供接收者。在您的情况下,您的构造函数
应该更像这样:
constructor: (@params) ->
@events = new EventsTable
@clock = 0
@create_cells()
@create_calls()
您的 run
方法与您的 构造函数
存在相同的“缺少接收者和缺少函数调用括号”问题。此外,当 setInterval
调用其回调时,它不提供任何特定的 @
(又名 this
),因此您需要一个绑定(bind)函数:
run: -> setInterval (=> @perform_routine()), 1000
# or
run: -> setInterval @perform_routine.bind(@), 1000
# or:
perform_routine: => ...
run: -> setInterval @perform_routine, 1000
您可能想要存储 setInterval
也在某个地方返回值,这样你就可以调用 clearInterval
停止它:
run: ->
@interval = setInterval ...
stop: ->
clearInterval(@interval) if(@interval)
@interval = undefined
您在其余的实验
中可能会遇到类似的问题。
关于javascript - 在 jQuery 例程中使用外部 JS 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23985917/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!