Uploaded image for project: 'ClojureScript'
  1. CLJS-719

this-as behaves incorrectly in "scoping function"

    Details

    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects versions: 1.7.145
    • Fix versions: 1.9.671
    • Labels:
      None

      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
      }
      

        Attachments

          Activity

            People

            • Assignee:
              dnolen David Nolen
              Reporter:
              alex+import import
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated: