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.
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
}
When a
this-as
expression gets put in a "scoping function", e.g. in alet
-binding, the value bound viathis-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 likefunction() { var self = this; // this refers to foo return self.bar; // returns "bar" }
foo.getBarWrong
on the other hand expands tofunction() { var bar = function() { var self = this; // this refers to enclosing function return self.bar; // returns undefined }(); return bar; // returns undefined }