this-as behaves incorrectly in "scoping function"

Description

When a this-as expression gets put in a "scoping function", e.g. in a let-binding, the value bound via this-as refers to the scoping function, and not to the outer scope.

Example:

(def foo (js-obj "bar" "baz" "getBarRight" (fn [] (this-as self (.-bar self))) "getBarWrong" (fn [] (let [bar (this-as self (.-bar self))] bar)))) (.log js/console (.getBarRight foo)) ;; => "baz" (.log js/console (.getBarWrong foo)) ;; => undefined

Whereas foo.getBarRight expands to something like

function() { var self = this; // this refers to foo return self.bar; // returns "bar" }

foo.getBarWrong on the other hand expands to

function() { var bar = function() { var self = this; // this refers to enclosing function return self.bar; // returns undefined }(); return bar; // returns undefined }

Environment

None

Activity

Show:

Details

Assignee

Reporter

Fix versions

Affects versions

Priority

Created December 7, 2013 at 4:26 PM
Updated June 27, 2017 at 4:15 PM