Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中call()方法的本机实现_Javascript - Fatal编程技术网

javascript中call()方法的本机实现

javascript中call()方法的本机实现,javascript,Javascript,我试图用javascript实现call方法的本机实现。这里我们需要处理在调用函数中传递的对象和其他参数。我使用eval()方法处理附加参数。是否有任何有效的方法来执行本机call()函数实现。这是我的密码 var name = { name: "JavaScript", version: "6", } function printName(location, district){ alert(this.name + ", " + this.version + ",

我试图用javascript实现call方法的本机实现。这里我们需要处理在调用函数中传递的对象和其他参数。我使用
eval()
方法处理附加参数。是否有任何有效的方法来执行本机
call()
函数实现。这是我的密码

var name = {
    name: "JavaScript", 
  version: "6",
}   

function printName(location, district){
    alert(this.name + ", " + this.version + ", " + location + ", " + district);
}

Function.prototype.myCall = function(...args){
  var param = args.slice(1),
      paramLength = param.length, 
      paramString = "JSONarg.myFun(";
  for(var i = 1; i <= paramLength; i++){
    paramString += "args["+i+"],";
  }
  paramString += ")";

  if(typeof this != 'function'){
    throw new Error(this + " is not a Function");
  }

  var JSONarg =  {
    ...args[0],
    myFun: this
  }
  return eval(paramString);
}

printName.myCall(name, "Chrome", "browser");
var名称={
名称:“JavaScript”,
版本:“6”,
}   
函数printName(位置、地区){
警报(this.name+”、“+this.version+”、“+location+”、“+district”);
}
Function.prototype.myCall=函数(…args){
变量参数=参数切片(1),
paramLength=param.length,
paramString=“JSONarg.myFun(”;
对于(var i=1;i无调用

Function.prototype.myCall = function(context, ...args){
    this.apply(context, args)
}

但是我看不出有什么理由这样做。

您的
调用
方法实现似乎是ES3版本,因为您创建了一个参数列表字符串并使用
eval
来执行函数。但是您在这里还使用了rest参数,这证明了浏览器支持ES6。因此,我们可以使用扩展语法来简化操作

总之,如果您必须使用ES3实现该方法,您可以这样做:

//ES3 viersion
Function.prototype.myCall=函数(thisArg){
if(该类型!=“函数”){
抛出新错误('调用方必须是函数')
} 
if(thisArg==null | | thisArg==undefined){
thisArg=窗口
}否则{
thisArg=新对象(thisArg)
}
常量args=[]
for(var i=1;i
上面的版本与您的类似。但是如果允许使用ES6,您可以像这样更高效地执行此操作:

//ES6 verison
Function.prototype.myCall=函数(thisArg,…args){
if(该类型!=“函数”){
抛出新错误('调用方必须是函数')
}
if(thisArg==null | | thisArg==undefined){
thisArg=窗口
}否则{
thisArg=新对象(thisArg)
}
thisArg.fn=此
常量res=thisArg.fn(…args)
删除thisArg.fn
返回res
}

然而,值得注意的是,这两个版本都不是标准实现。

为什么要这样做?想了解screenWell后面的调用函数是如何工作的,要真正做到这一点,您必须查看内部实现,它肯定不涉及
eval()
。这几乎肯定不是JavaScript代码。