`Function.bind` method is ineffective, and `this` context is always whatever object the variable is on.
The this context appears to always be whatever object a variable is called from. Function has a method called bind, but it appears to be ineffective at changing the this context of the function. This might be an issue with the re-binding of the variable called this.
otherObj = object
otherFunc = function(cb)
cb() // This has re-bound `this` inside of `cb` to `otherObj`
end
end
// I want to pass a function from within a class instance somewhere else
// that references members of `this`, but when otherFunc calls the passed
// function the `this` variable is re-bound to `otherObj` in either of the
// below cases.
otherObj.otherFunc(function() this.memberFunction() end) // or otherFunc(this.memberFunction.bind(this))
The only way I have found to effectively get around this is to define the function as local, then send call the local function inside of another anonymous function that is passed as a callback. Without the wrapper the local function will suffer from the same bug and have it's this context re-bound to the calling object.
https://microstudio.io/i/Loginus/instance_call/
I noticed that there is a problem with passing an object (A) to call another object (B) and its specific method, e.g. B.testCall, which is not known at the time of writing the code, but only passed in the parameters.
A.constructor = function( inst, method )
this.inst = inst
this.method = method
end
A.Call = function()
this.obj[this.method]()
end
a = new A()
a.setCall( b, b.testCall )
a.Call()
Unfortunately, the A.Call() function will attempt to call you as you would have typed
A.Call = function()
this.testCall()
end
And if the class does not have the testCall() function, it will throw an error.
If a class has a testCall() function, it will call it and you will be surprised how the program works.
Check out my program which avoids this problem in a very complicated way.
The rule is this:
- you remember the instance of the object you want to call
- you remember the name of the method you want to call
- you call instances and methods through an external function (from outside the class - function
instanceCall() ).
C = class
constructor = function( inst, method)
this.inst = inst
this.method = method
end
Call = function(arg)
instanceCall(this.inst, this.method, arg)
end
end
init = function()
instA = new TestClass( " Instance A")
c = new C( instA, getNameMethod( instA, instA.printName ))
c.Call()
end
I have defined my own method to create a new javascript closure that preserves the reference to this. It doesn't take an object to use for the context, though, and just locks the routine into it's original context.
Function.lock = function()
local self = this
local create = system.javascript("""
return (self) => (...args) => self(...args);
""")
return create(self)
end