复制和更改javascript函数范围
有没有办法将JavaScript函数范围复制到另一个函数复制和更改javascript函数范围,javascript,Javascript,有没有办法将JavaScript函数范围复制到另一个函数 (function(v){ var Ct=v.Ct=function(){ } var a="asdf"; Ct.prototype.fun=function(){ console.log(a); //prints 'asdf' } })(window) -------------------------------------------------- 无
(function(v){
var Ct=v.Ct=function(){
}
var a="asdf";
Ct.prototype.fun=function(){
console.log(a); //prints 'asdf'
}
})(window)
--------------------------------------------------
无法更改上述代码:
如何重写Ct.prototype.fun使其打印“asdfasdf”
以下示例无法获取“a”
如果有一个预先存在的变量或类似的东西需要访问,那么可以在初始闭包中提供一个getter,然后通过上下文访问它
(function(v){
var Ct=v.Ct=function(){
}
var a="asdf";
Ct.prototype.fun=function(){
console.log(a); //prints 'asdf'
}
Ct.prototype.getA = function() {
return a;
}
})(window)
Ct.prototype.fun=function(){
console.log(this.getA()+this.getA());
}
var o=new Ct();
o.fun();
对于任何有计划的事情,你最好重新考虑一下你是如何使用对象的。使用
这个
,然后使用apply()
,call()
,bind()
以及我可能缺少的任何其他东西。如果可能的话,将显式词汇范围的变量弯曲到外部将是一个痛苦的处方。您无法从外部访问a
。a
对于每个实例都不同吗?如果是这样,那么在构造函数中使用this.a
。@user1965351我不理解你的评论抱歉,澄清一下问题:事实上,以下代码是不能更改的:(function(v){var Ct=v.Ct=function(){}var a=“asdf”;Ct.prototype.fun=function(){console.log(a);//打印'asdf'})(窗口)如果你不能更改代码,那么就没有好的方法。上述代码的一个丑陋的破解方法是使用一个只为您收集值的log
方法临时重新定义console
变量。然后可以调用原始函数来检索该值。旧函数可以移动到别名并替换为新函数,在最终执行您所追求的行为之前,新函数可以为您完成所有这些。非常感谢。EMCAScript中有一个“[[Scope]]”,这是一个范围链,定义了执行函数对象的环境。我想得到原始函数的作用域,重新定义一个新函数并重置作用域。例如function.bind可以更改[this]变量。这个问题只在我心里。寻找你的答案。
(function(v){
var Ct=v.Ct=function(){
};
var a="asdf";
Ct.prototype.fun=(function(){
return function(){
console.log(a+a); //prints 'asdf'
}
})(a);
})(window);
var o=new Ct();
o.fun();
(function(v){
var Ct=v.Ct=function(){
}
var a="asdf";
Ct.prototype.fun=function(){
console.log(a); //prints 'asdf'
}
Ct.prototype.getA = function() {
return a;
}
})(window)
Ct.prototype.fun=function(){
console.log(this.getA()+this.getA());
}
var o=new Ct();
o.fun();