复制和更改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) -------------------------------------------------- 无

有没有办法将JavaScript函数范围复制到另一个函数

(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();