在这段代码中:
class MyClass
myfun: (arg) ->
for x in arg
do ->
...
Run Code Online (Sandbox Code Playgroud)
循环外部的范围是MyClass,而在循环内部(它是一个匿名函数),范围变为DOMWindow.
为什么会这样?我该怎样预防呢?我的主要问题是,如果范围发生变化,我无法访问MyClass类中的其他函数.
谢谢
有人曾与他们的代码中的问题在不同的网站,我发现使用@在他们的代码了很多,我只是好奇它是什么,为什么他在使用它.
这是他的代码:
# check if supports css3
supports = (->
div = document.createElement("div")
vendors = "Khtml Ms O Moz Webkit".split(" ")
len = vendors.length
(prop) ->
return true if prop of div.style
prop = prop.replace(/^[a-z]/, (val) ->
val.toUpperCase()
)
while len--
return true if vendors[len] + prop of div.style
false
)()
class HandleCarousel
constructor: (wrapper, block_number) ->
@block_number = block_number
@wrapper = wrapper
wrapper = null
counter: 0
block_number: 0
loopTimeout = 5000
loopTimer = null
handleBlur: => …Run Code Online (Sandbox Code Playgroud) 我试图通过$(this.el)在Backbone模型的成功或错误回调中引用视图元素.
例:
从SomeViewClass(扩展Backbone.View)中,
@model.save({}, {
success: (model, response) ->
($ this.el).removeClass("editing")
})
Run Code Online (Sandbox Code Playgroud)
但是,我坚持认为"this"不引用SomeViewClass实例.有任何想法吗?
在javascript中编写以下函数有两种功能相同的方法,哪种更好或更有效,为什么?
(str) ->
s = 0
for i in [0...str.length]
s += str.charCodeAt i
s
Run Code Online (Sandbox Code Playgroud)
要么
(str) ->
s = 0
for i in str
s += i.charCodeAt 0
s
Run Code Online (Sandbox Code Playgroud)
旁白:你能建议其他任何方法吗?
编辑:根据JSPerf,第一个更快:http://jsperf.com/coffee-for-loop-speed-test - 这是为什么?
我正在尝试学习CoffeeScript,并在第一次尝试时创建了这个简单的类:
class test
fib: (x) ->
x if x == 0 || x == 1
(this.fib x-1) + (this.fib x-2)
t = new test
alert(t.fib(6));
Run Code Online (Sandbox Code Playgroud)
此代码不起作用,因为它在if语句中没有return语句进行编译.这有效:
fib: (x) ->
return x if x == 0 || x == 1
(this.fib x-1) + (this.fib x-2)
Run Code Online (Sandbox Code Playgroud)
为什么我需要明确的回报?基于语言描述,特别是http://jashkenas.github.com/coffee-script/#expressions,我希望x表达式由编译器转换为返回.
将一些JavaScript转换为CoffeeScript时遇到了问题.基本问题是我从使用$ .each到CoffeeScript理解,现在我遇到了一个问题,即闭包中捕获了理解的最后一个值.让我们从原始JavaScript开始:
function bindKeyboardControls(websocket) {
var moveKeyMap = {
Down: ['down', 's'],
Up: ['up', 'w'],
Left: ['left', 'a'],
Right: ['right', 'd']
};
$.each(moveKeyMap, function (direction, keys) {
$.each(keys, function (_, key) {
$(document).bind('keydown', key, function () { move(websocket, direction); });
});
});
};
Run Code Online (Sandbox Code Playgroud)
这是我第一次尝试使用CoffeeScript:
bindKeyboardControls = (websocket) ->
moveKeyMap =
Down: ['down', 's']
Up: ['up', 'w']
Left: ['left', 'a']
Right: ['right', 'd']
for direction, keys of moveKeyMap
for key in keys
$(document).bind('keydown', key, -> move(websocket, direction))
null
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?那么这里是生成的JavaScript:
bindKeyboardControls = …Run Code Online (Sandbox Code Playgroud) 我正在使用CoffeeScript和KnockoutJS,并且在函数中获取视图模型的值时遇到问题.
我有一个视图模型:
window.Application || = {}
class Application.ViewModel
thisRef = this
searchTerm: ko.observable("")
search: ->
alert @searchTerm
Run Code Online (Sandbox Code Playgroud)
编译为:
window.Application || (window.Application = {});
Application.ViewModel = (function() {
var thisRef;
function ViewModel() {}
thisRef = ViewModel;
ViewModel.prototype.searchTerm = ko.observable("");
ViewModel.prototype.search = function() {
return alert(this.searchTerm);
};
return ViewModel;
})();
Run Code Online (Sandbox Code Playgroud)
此视图模型是父视图模型的一部分,它将其公开为字段.问题是我无法获得对子视图模型的引用.在搜索功能中,"this"是父级的一个实例,我不想要它.
我正在阅读关于CoffeeScript的文章,我仍然试图定位语言,可以做什么,最佳做法是什么等等; 我更习惯强类型语言(AS3,Java,Scala)所以我的两个问题可能会让你微笑一下:)
问题1:自定义集合
您如何看待定制系列?JS/CS是这方面最弱的语言之一; 例如,没有Array.remove,你必须使用繁琐的splice()方法.一些函数库(如下划线)通过提供将数组/对象作为第一个arg的函数来扩充API,但是给出了我更喜欢的选择:
list fancyFunction 3, 4
Run Code Online (Sandbox Code Playgroud)
而不是
fancyFunction list 3, 4
Run Code Online (Sandbox Code Playgroud)
假设我创建了一个List类; 是否可能,如果是,这个类能够使用CS的理解语法的必要条件是什么?最糟糕的情况是,我猜List可以有一个toArray()方法,而且可以对该返回值执行常规的CS操作,但我希望有更好的解决方案.
理想情况下,我希望能够定义丰富的自定义集合,但不能以失去理解为代价等.
问题2:可变性
人们对CS/JS中的可变性非常小心的感受是什么?
当我在网上阅读各种代码时,我的印象是一切都是可变的,人们通常认为最好不要打扰并减少代码行.
例如,可变与不可变的基本Point类:(希望我没有做错事)
易变的
class Point
constructor: (@x, @y) ->
Run Code Online (Sandbox Code Playgroud)
不可变
class Point
constructor: (x, y) ->
@x = -> x
@y = -> y
Run Code Online (Sandbox Code Playgroud)
没有那么复杂但稍微怪异的语法.另一个考虑因素是JS并不是人类已知的最快的东西,并且为了成为纯粹主义者而不得不在循环中创建大量对象可能会产生反效果,性能明智.我没有对创建新Point对象的成本进行基准测试,而不是改变一个成员.
想象一个大型应用程序,其中有许多模块通过瘦API进行通信.你不想传递不可变对象吗?或者你会执行防御性副本吗?
注意:我并不是想尝试将CS改为我所知道的语言; 相反,我想知道重用其他语言中理所当然的一些概念是否有意义.
谢谢
更新:我找到了解决方案,请查看本页底部...
我有一个用CoffeScript编写的Node.js,Express,MongoDB,Mongoose项目,我可以创建和读取数据,但我无法更新.
这就是我的代码的样子;
app.js
# update
app.put "/admin/:id.:format?", (req, res) ->
Content.findById req.body.content.id, (err, c) ->
c.title = req.body.content.title
c.body = req.body.content.body
c.save (err) ->
switch req.params.format
when "json"
res.send c.__doc
else
res.redirect "/admin"
Run Code Online (Sandbox Code Playgroud)
edit.jade
h2 Edit Content
form(method='post', action='/admin/' + c.id)
input(name='content[id]', value=c.id, type='hidden')
input(name='_method', value='PUT', type='hidden')
div
label Title:
input(name='content[title]', value=c.title || '')
div
label Body:
textarea(name='content[body]')=c.body || ''
div
input(type='submit', value='Save')
Run Code Online (Sandbox Code Playgroud)
这就是我的控制台所说的
127.0.0.1 - - [Thu, 13 Oct 2011 21:39:55 GMT] "POST /admin/4e96ec17fd7da7cb18000001 HTTP/1.1" 404 - …Run Code Online (Sandbox Code Playgroud) 当我的脚本由于任何原因无法解析时,我从编译器获得了一个堆栈跟踪,根本没有深入了解我的脚本中问题所在的位置:
mpurvis@citadel:~/coffee$ coffee -c Test.coffee
/usr/local/lib/node_modules/coffee-script/lib/command.js:15
return process.binding('stdio').writeError(line + '\n');
^
Error: No such module
at /usr/local/lib/node_modules/coffee-script/lib/command.js:15:20
at /usr/local/lib/node_modules/coffee-script/lib/command.js:167:7
at /usr/local/lib/node_modules/coffee-script/lib/command.js:115:26
at [object Object].<anonymous> (fs.js:108:5)
at [object Object].emit (events.js:64:17)
at afterRead (fs.js:1074:12)
at Object.wrapper [as oncomplete] (fs.js:246:17)
Run Code Online (Sandbox Code Playgroud)
现在,它只是一个玩具脚本来尝试系统,所以我通常可以尝试直到它再次工作,但这在任何大小的文件中都是不可能的.是否有一些技巧我没有看到错误发生的行?
谢谢!
coffeescript ×10
javascript ×5
backbone.js ×1
binding ×1
collections ×1
express ×1
immutability ×1
jquery ×1
knockout.js ×1
loops ×1
mongodb ×1
mongoose ×1
node.js ×1
performance ×1