전화 및 적용하십시오 차이가 뭘까?

'콜' 을 사용하여 '와' 는 어떤 차이가 적용하십시오 호출하십시오 함수은?

var func = function() {
  alert('hello!');
};

'' vs ' (),' 펑c콜 펑c애플리 ();

앞에서 말한 두 가지 방법을 성능 차이가 있습니까? 이 때 사용할 수 있는 '콜' 오버 '베스트' 및 그 반대로 적용하십시오?

질문에 대한 의견 (12)
해결책

다른 점은 '적용하십시오 사용하여 함수를 호출할 수 있습니다 "' 인수만" '표시됨과 스토리지였습니다.' '콜' 을 매개변수입니다 명시적으로 나열할 수 있어야 합니다. A , 는 위한 유용한 연상기호 _&quot arra comma.&quo , 에 대한 _을 및 C

39 에 관한 문서가 MDN& 지켜보리니 적용하십시오매입옵션.

Dtep 문법:

'테풍크션.애플리 (발루포티스, 라이오파리스)'

'테풍크티언스콜 (발루포티스 arg1 arg2,,).'

또한, vmware. ES6 가능성을 3, ['전파하므로'] 이 어레이에는 '콜' 기능을 사용할 수 있는 here 호환성 볼 수 있습니다.

샘플 코드:

<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. &gt 거짓값 -;

function theFunction(name, profession) {
    console.log("My name is " + name + " and I am a " + profession +".");
}
theFunction("John", "fireman");
theFunction.apply(undefined, ["Susan", "school teacher"]);
theFunction.call(undefined, "Claude", "mathematician");
theFunction.call(undefined, ...["Matthew", "physicist"]); // used with the spread operator

끝 - &lt 스니핏 >;!

해설 (12)

스콧 앨런 k 는 [좋은 작성자] (http://odetocode.com/blogs/scott/archive/2007/07/04/function-apply-and-function-call-in-javascript.aspx) 이 문제에 대한.

기본적으로, 그들이 서로 어떻게 처리하는 기능을 인수만.

&gt. () 메서드를 호출 () 는 동일한 적용 제외) 로 어레이에서는 적용하십시오 () 가 두 번째 매개변수입니다. 이 어레이에는 대상에 대한 method.&quot 인수만 나타냅니다.

그래서:

// assuming you have f
function f(message) { ... }
f.call(receiver, "test");
f.apply(receiver, ["test"]);
해설 (2)

기능을 사용할 때, 각 부품에 대한 답변을 사용할 경우 적용하십시오 don& '' t know, you will be 반군지역 인수만 # 39 수가 있는 경우, 또는 이미 어레이나 같은 어레이입니다 객체 (object 포워드하도록 인수만 '같은' 자신의 주장. 그렇지 않으면 '콜' s no. # 39 there& 사용할 필요가 있는 랩 인수 이후 어레이입니다.

f.call(thisObject, a, b, c); // Fixed number of arguments

f.apply(thisObject, arguments); // Forward this function's arguments

var args = [];
while (...) {
    args.push(some_value());
}
f.apply(thisObject, args); // Unknown number of arguments

39 I& 때, 모든 인수 (마음에 들어), I 'm not 반군지역 I& # 39 m , 함수 호출' 이후 포지셔닝하십시오 호출하십시오. '' 를 의미하는 것이라고 적용하십시오 틀렸다니까 기능을 적용 (존재하지 않는) 인수만.

39 를 제외한 모든 성능 차이가 있을 수 있고, shouldn&, t '와' 랩 (wrap) 의 인수를 어레이에서는 적용하십시오 사용할 경우 (예를 들어 '프리애플리 (티노비치 [a, b, c])' 대신 '파스칼 (티노비치 a, b, c)'). 그래서 내가 haven& 차이가 있을 수 있지만, t # 39 테스트되었습니다 약간만이라도 있지만브라우저에 매우 구체적인. # 39 의 '콜' 가 더 빠르게 it& 가능성이 있는 경우, t '와' 적용하십시오 어레이에서는 이미 인수만 don& # 39 가 더 빠르게 수행할 경우.

해설 (0)

39 의 here& 좋은 연상기호. <;;;;;;; /b&gt A&lt b&gt b&gt A&lt /b&gt 프리 /dev/raw/raw1 &lt 라이스 및 &lt b&gt A&lt /b&gt, 하나 또는 두 개의 인수,, 항상 걸린다. B&gt &lt 사용할 때,,,, 모든 /b&gt C&lt &lt b&gt C&lt /b&gt 인수만 수를 마운트 합니다.

해설 (2)

이것은 오래된 주제, 동시에 보다 약간 지아프리스 스칼 지적하고 싶어서 # 39, 내가 can& 당근이지를 t tell you why).

지켜보리니 http://jsperf.com/test-call-vs-apply/3 에스페르프,

  • ['업데이트!']

더글러스 크록 포드 잠시 언급, 이 둘 사이의 차이를 설명하란말야 도움이 될 수 있는 성능 차이. http://youtu.be/ya4UHuXNygM? t = 15m52s

한편, 제로 또는 그 이상의 시간이 걸리는 적용하십시오 인수만 배열입니다 호출하십시오 개별 매개변수입니다! 아 헉!

(이, [.]) '' 자마카베리

'스칼 (,, 이 param1 param2 param3 param4.)'

해설 (5)

Inet6.0 추출을 에서 [마감: 이 의해 명확한 가이드 마이클 볼린] (http://www.amazon.com/closure-definitive-guide-michael-bolin/dp/ 1449381871). # 39 의 포화 it& 볼 수 있다며 그러나 이 약간 길고, 많은 인사이트를 부록 B. JavaScript 에서 자주 오해 Concepts&quot ";:

이 함수가 호출될 때 '는 뭐라구오

함수를 호출할 때 ' ()', '형태의 푸실바리바스 객체에는 푸실바 피쳐라고 합니다' 이 된다. 함수가 호출될 때 사용될 수 있는 것은 '이 값은 더':

var obj = {};
obj.value = 10;
/** @param {...number} additionalValues */
obj.addValues = function(additionalValues) {
  for (var i = 0; i < arguments.length; i++) {
    this.value += arguments[i];
  }
  return this.value;
};
// Evaluates to 30 because obj is used as the value for 'this' when
// obj.addValues() is called, so obj.value becomes 10 + 20.
obj.addValues(20);

수신기가 없는 경우, 그 함수가 호출될 때 명시성 되고 글로벌 객체에는 된다. 설명에 따라 goog.global&quot "; 이 때, 창은 47hz 페이지의 웹 브라우저에서 실행되는 글로벌 JavaScript 객체. 이로 인해 일부 놀라운 비헤이비어를:

var f = obj.addValues;
// Evaluates to NaN because window is used as the value for 'this' when
// f() is called. Because and window.value is undefined, adding a number to
// it results in NaN.
f(20);
// This also has the unintentional side effect of adding a value to window:
alert(window.value); // Alerts NaN

비록 '오브j.아다발 주' 와 'f' () 는 다음과 같은 경우 다르게 행동하기 때문에 동일한 기능을 하는 다른 값을 수신기가 각 가능하다. 따라서 함수를 호출할 때 가리키는 '이', '이 정확한 값을 가질 때 반드시 확인해야 합니다' 라고 합니다. 이 '수' 의 경우, 함수 본문 관심용 referenced 선택해제합니다 않았습니다 'f' (20) '와' (20) 의 비헤이비어를 오브j.아다발 주 약간만이라도 마찬가지다.

Javascript 의 객체에는 최고급 기능이 있기 때문에, 자신의 방법이 있을 수 있습니다. 모든 기능을 할 수 있는 '가능하다' () '와' () 메서드를 호출 적용하십시오 재정의하려면 수신기 (즉, that '이' 는 객체에는) 함수를 호출할 때. 서명 방법은 다음과 같습니다.

/**
* @param {*=} receiver to substitute for 'this'
* @param {...} parameters to use as arguments to the function
*/
Function.prototype.call;
/**
* @param {*=} receiver to substitute for 'this'
* @param {Array} parameters to use as arguments to the function
*/
Function.prototype.apply;

단, 유일한 차이점은 '콜 ()' 와 ' () 함수 호출 ()' '' 에로남이네 적용하십시오 받은 만큼 개인 반면, ' ()' 는 매개변수입니다 인수만 적용하십시오 솔리드로 단일 어레이입니다:

// When f is called with obj as its receiver, it behaves the same as calling
// obj.addValues(). Both of the following increase obj.value by 60:
f.call(obj, 10, 20, 30);
f.apply(obj, [10, 20, 30]);

',' F '와' 로 오브j.아다발 주 avamer 호출은 다음과 같은 함수 () 는 다음과 같은 뜻이 있다.

obj.addValues.call(obj, 10, 20, 30);
obj.addValues.apply(obj, [10, 20, 30]);

그러나 괜찼습니다 '콜 ()' ' ()' 는 이 값을 disk_b_s10database 적용하십시오 자체 수신기가 대체하십시오 수신기의 경우, 다음과 같은 주장을 미지정을 작동하지 않습니다.

// Both statements evaluate to NaN
obj.addValues.call(undefined, 10, 20, 30);
obj.addValues.apply(undefined, [10, 20, 30]);

'이' 가치 'null' 또는 '때' 정의되지 않은 함수가 호출될 수 없다. 'Null' 또는 '정의되지 않은' 때 '로 제공되는 호출 () ()', '또는' 수신기는 적용하십시오 글로벌 객체에는 대신 값은 수신기 이용되고 있다. 따라서 이전 코드는 '라는 속성 값을 동일하게 원치 않는 부작용이 추가에는' 글로벌 객체에는.

생각할 수도 있을 수 없기 때문에 도움됐네 역할을 하였던 변수를 워크플로가 할당되었는지. 따라서 이 때 가치가 있다는 생각에 강화하십시오 바인딩됩니다 함수가 호출될 때 아닌 정의된다.

  • 푸십시오 끝.
해설 (2)

이 시간에 유용한 기능을 한 객체에 대한 대출 빌리는 단순히 다른 객체에는 객체에는 실행하므로 빌린 것처럼, 즉 이 이 기능을 추가했다.

  • 작은 코드 example:*
var friend = {
    car: false,
    lendCar: function ( canLend ){
      this.car = canLend;
 }

}; 

var me = {
    car: false,
    gotCar: function(){
      return this.car === true;
  }
};

console.log(me.gotCar()); // false

friend.lendCar.call(me, true); 

console.log(me.gotCar()); // true

friend.lendCar.apply(me, [false]);

console.log(me.gotCar()); // false

이러한 방식은 확증하노라 객체에는 임시 기능을 매우 유용합니다.

해설 (1)

또 다른 예를 들어, 적용 및 호출하십시오 함께 바인딩하지.

  • 전화 및 차이는 있지만, 다음과 같은 바인딩하지 * 작동됨 적용하십시오 볼 수 있다.
  1. 바인딩하거나 인스턴스입니다 되돌려줍니다 실행할 수 있는 함수
  2. 39, & # 39 는 첫 번째 매개변수에서 this , *

  3. 쉼표로 구분된 두 번째 파라메트가 a 목록니다 인수 ( 같은 호츨 )

}

function Person(name) {
    this.name = name; 
}
Person.prototype.getName = function(a,b) { 
     return this.name + " " + a + " " + b; 
}

var reader = new Person('John Smith');

reader.getName = function() {
   // Apply and Call executes the function and returns value

   // Also notice the different ways of extracting 'getName' prototype
   var baseName = Object.getPrototypeOf(this).getName.apply(this,["is a", "boy"]);
   console.log("Apply: " + baseName);

   var baseName = Object.getPrototypeOf(reader).getName.call(this, "is a", "boy"); 
   console.log("Call: " + baseName);

   // Bind returns function which can be invoked
   var baseName = Person.prototype.getName.bind(this, "is a", "boy"); 
   console.log("Bind: " + baseName());
}

reader.getName();
/* Output
Apply: John Smith is a boy
Call: John Smith is a boy
Bind: John Smith is a boy
*/
해설 (0)

39, & # 39 와 같은 예를 들어 있는 i&; d 표시하십시오 valueForThis& # 39;; 인수 사용됩니다.

Array.prototype.push = function(element) {
   /*
   Native code*, that uses 'this'       
   this.put(element);
   */
}
var array = [];
array.push(1);
array.push.apply(array,[2,3]);
Array.prototype.push.apply(array,[4,5]);
array.push.call(array,6,7);
Array.prototype.push.call(array,8,9);
//[1, 2, 3, 4, 5, 6, 7, 8, 9] 
해설 (0)

콜 () 는 쉼표로 구분된 인수를, ex:

'스칼 (, 범위, arg1 arg2 arg3)'

및 적용 () 는 배열입니다 인수만, ex:

'자마카베리 (범위 [arg1, arg2, arg3])'

다음은 몇 차례 더 사용 예: http://blog.i-evaluation.com/2012/08/15/javascript-call-and-apply/

해설 (1)

1 에서 [ 매든 () 는 docs 에 펑크션.프로토티페리애플리 ):

&gt. '이' 갖는 함수는 주어진 값 및 적용 () 메서드를 호출 &gt. 인수만 제공한 어레이에서는 (호스트였든 같은 어레이입니다 객체). &gt. &gt. # 구문을 &gt. &gt. 펑리애플리 (티사리 [아르자이])

2 에서 [ 매든 () 는 docs 에 펑크션.프로토티파스칼 ):

&gt. 더 콜 () 메서드를 호출 '' 이 갖는 함수는 주어진 값 및 인수만 제공한 것이다. &gt. &gt. # 구문을 &gt. &gt. 펑스콜 (티사리 [, arg1 [, arg2 [.]]])

[ Function. apply 및 펑크티언스콜 JavaScript 로 ] 에서 3:

&gt. 적용 () 메서드를 호출 () () 는 동일한 제외한 적용하십시오 필요합니다 &gt. 어레이입니다 tpc. 두 번째 매개변수입니다. 이 어레이에는 인수에 대해 나타냅니다. &gt. 타겟대상 메서드입니다.

코드 예제:

<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 참 - &gt.

var doSomething = function() {
    var arr = [];
    for(i in arguments) {
        if(typeof this[arguments[i]] !== 'undefined') {
            arr.push(this[arguments[i]]);
        }
    }
    return arr;
}

var output = function(position, obj) {
    document.body.innerHTML += '<h3>output ' + position + '</h3>' + JSON.stringify(obj) + '\n<br>\n<br><hr>';
}

output(1, doSomething(
    'one',
    'two',
    'two',
    'one'
));

output(2, doSomething.apply({one : 'Steven', two : 'Jane'}, [
    'one',
    'two',
    'two',
    'one'
]));

output(3, doSomething.call({one : 'Steven', two : 'Jane'},
    'one',
    'two',
    'two',
    'one'
));

끝 - &lt 스니핏 >;!

참조 [ 이 바이올린 ] [4].

해설 (0)

근본적인 차이점은 '콜 ()', 'a 적용하십시오 동시에 수용할 수 있는 인수 목록 ()' 의 단일 어레이입니다 인수만 .

해설 (1)

39, s, I wrote here& 작은 틱 게시물로의 여기있을:

http://sizeableidea.com/call-versus-apply-javascript/

var obj1 = { which : "obj1" },
obj2 = { which : "obj2" };

function execute(arg1, arg2){
    console.log(this.which, arg1, arg2);
}

//using call
execute.call(obj1, "dan", "stanhope");
//output: obj1 dan stanhope

//using apply
execute.apply(obj2, ["dan", "stanhope"]);
//output: obj2 dan stanhope

//using old school
execute("dan", "stanhope");
//output: undefined "dan" "stanhope"
해설 (1)

다른 점은 '는 함수 호출 () 는 함수 ()' 와 ',' 인수만 별도로 적용하십시오 인수만 작업공간에서 어레이입니다.

해설 (0)

호츨 차별화합니다 아래와 같은 방법을 적용할 수 있습니다.

문의: 제공하십시오 갖는 함수는 인수가 것이다. 알 수 없는 경우 인수만 통과했거나 전달하십시오 호출하십시오 인수에 사용할 수 있습니다.

적용됩니다. 매입옵션 갖는 함수는 인수가 어레이에서는 제공된다. # 39 적용하십시오 don& 모르는 경우 사용할 수 있습니다, 함수에 대한 전달하십시오 시용되는 인수 할 것 같습니다.

39 의 장점을 있습니다 적용하십시오 호출하십시오 don& 통해 우리는 오직 우리 변경하십시오 인수, t need to a 어레이입니다 수를 변경할 수 있게 된다.

성능에 큰 차이가 없습니다. 하지만 우리는 요청이 다소 빠르게 말할 수 있는 것처럼 비교 평가할 필요가 있기 때문에 적용하십시오 어레이에서는 적용하십시오 메서드입니다.

해설 (0)

차이점을 어떻게 전달할 수 있는 방법을 모두 매개변수입니다.

"A 와 c 를 어레이용 쉼표 '는 휴대용 연상기호.

해설 (1)

이 때 사용되는 함수 호출 및 적용하십시오 강제로 '가치' 는 모두 처형되었다. 유일한 차이점은 '는' 콜 'n + 1' 이 '와' & # 39, 여기서 1 은 '인수만 n& # 39. 인수의. 단, 다른 하나는 '이' 2 인자 '' 적용하십시오 다른 하나는 인수 어레이입니다.

내가 볼 수 있는 '콜' 는 '우리가' 적용하십시오 위임합니다 다른 기능을 통해 쉽게 할 수 없이 많은 노력을 함수 호출.

function sayHello() {
  console.log(this, arguments);
}

function hello() {
  sayHello.apply(this, arguments);
}

var obj = {name: 'my name'}
hello.call(obj, 'some', 'arguments');

'안녕' 을 '우리가 얼마나 쉽게 준수하십시오 위임됩니다 sayHello "사용' 을 (를) '이 아니라', '적용하십시오 호출하십시오 달성하실 매우 어렵다.

해설 (0)

비록 '콜' 와 '적용하십시오 아키베 한 곳 이상의 같은 일이 있을 것 같아요', '콜' 하지만 '적용하십시오 사용할 수 없습니다' 만 사용할 수 있습니다. 즉 할 때 상속 및 지원부에서는 매핑하려는 security. 구성자를.

이것은 또 다른 클래스를 작성할 수 있는 기능을 확장하여 클래스뿐만 汲摹窍妨绰 클래스를 만드는.

function makeClass( properties ) {
    var ctor = properties['constructor'] || function(){}
    var Super = properties['extends'];
    var Class = function () {
                 // Here 'call' cannot work, only 'apply' can!!!
                 if(Super)
                    Super.apply(this,arguments);  
                 ctor.apply(this,arguments);
                }
     if(Super){
        Class.prototype = Object.create( Super.prototype );
        Class.prototype.constructor = Class;
     }
     Object.keys(properties).forEach( function(prop) {
           if(prop!=='constructor' && prop!=='extends')
            Class.prototype[prop] = properties[prop];
     });
   return Class; 
}

//Usage
var Car = makeClass({
             constructor: function(name){
                         this.name=name;
                        },
             yourName: function() {
                     return this.name;
                   }
          });
//We have a Car class now
 var carInstance=new Car('Fiat');
carInstance.youName();// ReturnsFiat

var SuperCar = makeClass({
               constructor: function(ignore,power){
                     this.power=power;
                  },
               extends:Car,
               yourPower: function() {
                    return this.power;
                  }
              });
//We have a SuperCar class now, which is subclass of Car
var superCar=new SuperCar('BMW xy',2.6);
superCar.yourName();//Returns BMW xy
superCar.yourPower();// Returns 2.6
해설 (1)

주된 차이는 있지만, 이제 정상적으로 인수 범위와 호츨 사용하여 변경하십시오 사용하여 해당 인수만 표시됨과 어레이입니다 전화하시기 비헤이비어는 적용하십시오 패스 (pass 솔리드로 어레이에서는). 그러나 그들은 그들이 해야 할 일이 코드에 측면에서 매우 비슷하다.

&gt. 이 기능은 거의 동일한 하는 동안 구문 &gt. 근본적인 차이점은 콜 () 은 인수를 적용하십시오 (), &gt. 한편, 단일 어레이입니다 적용하십시오 목록 () 은 인수.

그래서 확인할 수 있듯이, 우리가 사용하는 경우가 있지만, 여전히 큰 차이가 없는 포지셔닝하십시오 콜 () 또는 적용하십시오 (). 예를 들어 보면 알 수 있는 가장 작고 큰 숫자를 찾는 아래 코드는 배열을 사용하여 충스러웠으니 매든 적용하십시오 방법:

// min/max number in an array
var numbers = [5, 6, 2, 3, 7];

// using Math.min/Math.max apply
var max = Math.max.apply(null, numbers); 
// This about equal to Math.max(numbers[0], ...)
// or Math.max(5, 6, ...)

var min = Math.min.apply(null, numbers)

그래서 우리는 이 주된 차이는 반군지역 arguments:&lt br&gt just the way;; &lt br>;

  • Call:*&lt br>;
function.call(thisArg, arg1, arg2, ...);
  • Apply:*&lt br>;
function.apply(thisArg, [argsArray]);
해설 (0)

요약:

모두 적용할 수 있는 방법 () '이' call () '와' 에 '펑크션.프로토티페'. 따라서 객체에는 프로토타입 체인을 통해 모든 기능을 사용할 수 있습니다. 모두 실행할 수 있는 '콜 ()' 와 ' ()' 의 값을 갖는 함수는 적용하십시오 지정된 '이'.

주요 차이점은 'the way you call ()' 와 ' ()' 가 적용하십시오 인수의 전달해야 다르거든요. '모두' you call () '와' 적용하십시오 전달하십시오 () 는 이에 따라 우선 인수 객체에는 원하는걸까요 값으로 '이'. 서로 다른 인수만 다음과 같은 방법으로:

  • Call () '을 (를)' 에서 정상적으로 인수만 동일팔레트에 합니다 (시작으로 두 번째 인수)
  • () '와' 적용하십시오 전달하십시오 인수 어레이당 합니다.

예:

<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. &gt 거짓값 -;

let obj = {
  val1: 5,
  val2: 10
}

const summation = function (val3, val4) {
  return  this.val1 + this.val2 + val3 + val4;
}

console.log(summation.apply(obj, [2 ,3]));
// first we assign we value of this in the first arg
// with apply we have to pass in an array

console.log(summation.call(obj, 2, 3));
// with call we can pass in each arg individually

끝 - &lt 스니핏 >;!

이러한 기능을 사용해야 하는 이유는?

'이' 이 까다로운 가끔씩 javascript 가치를 창출할 수 있습니다. 이 함수가 실행될 때 아닌 '때' 의 가치를 판결되므로 기능은 바로 이 '우리' 의 경우 데프수드 바인딩하면 defined. 기능은 사용할 수 있습니다 () '이' call () '와' 적용하십시오 적용할 수 있다. 예를 들면 다음과 같습니다.

<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. &gt 거짓값 -;

var name = 'unwantedGlobalName';

const obj =  {
  name: 'Willem',
  sayName () { console.log(this.name);}
}

let copiedMethod = obj.sayName;
// we store the function in the copiedmethod variable

copiedMethod();
// this is now window, unwantedGlobalName gets logged

copiedMethod.call(obj);
// we enforce this to be obj, Willem gets logged

끝 - &lt 스니핏 >;!

해설 (0)