mirror of
https://github.com/jashkenas/coffeescript.git
synced 2022-11-09 12:23:24 -05:00
124 lines
2.5 KiB
CoffeeScript
124 lines
2.5 KiB
CoffeeScript
# Scope
|
|
# -----
|
|
|
|
# * Variable Safety
|
|
# * Variable Shadowing
|
|
# * Auto-closure (`do`)
|
|
# * Global Scope Leaks
|
|
|
|
test "reference `arguments` inside of functions", ->
|
|
sumOfArgs = ->
|
|
sum = (a,b) -> a + b
|
|
sum = 0
|
|
sum += num for num in arguments
|
|
sum
|
|
eq 10, sumOfArgs(0, 1, 2, 3, 4)
|
|
|
|
test "assignment to an Object.prototype-named variable should not leak to outer scope", ->
|
|
# FIXME: fails on IE
|
|
(->
|
|
constructor = 'word'
|
|
)()
|
|
ok constructor isnt 'word'
|
|
|
|
test "siblings of splat parameters shouldn't leak to surrounding scope", ->
|
|
x = 10
|
|
oops = (x, args...) ->
|
|
oops(20, 1, 2, 3)
|
|
eq x, 10
|
|
|
|
test "catch statements should introduce their argument to scope", ->
|
|
try throw ''
|
|
catch e
|
|
do -> e = 5
|
|
eq 5, e
|
|
|
|
test "loop variable should be accessible after for-of loop", ->
|
|
d = (x for x of {1:'a',2:'b'})
|
|
ok x in ['1','2']
|
|
|
|
test "loop variable should be accessible after for-in loop", ->
|
|
d = (x for x in [1,2])
|
|
eq x, 2
|
|
|
|
class Array then slice: fail # needs to be global
|
|
class Object then hasOwnProperty: fail
|
|
test "#1973: redefining Array/Object constructors shouldn't confuse __X helpers", ->
|
|
arr = [1..4]
|
|
arrayEq [3, 4], arr[2..]
|
|
obj = {arr}
|
|
for own k of obj
|
|
eq arr, obj[k]
|
|
|
|
test "#2255: global leak with splatted @-params", ->
|
|
ok not x?
|
|
arrayEq [0], ((@x...) -> @x).call {}, 0
|
|
ok not x?
|
|
|
|
test "#1183: super + fat arrows", ->
|
|
dolater = (cb) -> cb()
|
|
|
|
class A
|
|
constructor: ->
|
|
@_i = 0
|
|
foo : (cb) ->
|
|
dolater =>
|
|
@_i += 1
|
|
cb()
|
|
|
|
class B extends A
|
|
constructor : ->
|
|
super
|
|
foo : (cb) ->
|
|
dolater =>
|
|
dolater =>
|
|
@_i += 2
|
|
super cb
|
|
|
|
b = new B
|
|
b.foo => eq b._i, 3
|
|
|
|
test "#1183: super + wrap", ->
|
|
class A
|
|
m : -> 10
|
|
|
|
class B extends A
|
|
constructor : -> super
|
|
|
|
B::m = -> r = try super()
|
|
|
|
eq (new B).m(), 10
|
|
|
|
test "#1183: super + closures", ->
|
|
class A
|
|
constructor: ->
|
|
@i = 10
|
|
foo : -> @i
|
|
|
|
class B extends A
|
|
foo : ->
|
|
ret = switch 1
|
|
when 0 then 0
|
|
when 1 then super()
|
|
ret
|
|
eq (new B).foo(), 10
|
|
|
|
test "#2331: bound super regression", ->
|
|
class A
|
|
@value = 'A'
|
|
method: -> @constructor.value
|
|
|
|
class B extends A
|
|
method: => super
|
|
|
|
eq (new B).method(), 'A'
|
|
|
|
test "#3259: leak with @-params within destructured parameters", ->
|
|
fn = ({@foo}, [@bar], [{@baz}]) ->
|
|
foo = bar = baz = false
|
|
|
|
fn.call {}, {foo: 'foo'}, ['bar'], [{baz: 'baz'}]
|
|
|
|
eq 'undefined', typeof foo
|
|
eq 'undefined', typeof bar
|
|
eq 'undefined', typeof baz
|