2016-04-06 4 views
0

私はbindcallapplyの機能を学んでいます。私はAPI呼び出しのコールバックを設定するバインドを使用しています。ここに私の関数です:Javascriptバインドは値による呼び出しですか?

var successCb = successCallback.bind(null, $scope.list), 
     errorCb = errorCallback.bind(null, $scope.list); 

私はコールバックとしてそれらを使用します:

$scope.loadJson = function() { 
     $http.get('data.json').then(successCb, errorCb); 
    }; 

彼らが適切に呼び出さなっている

function errorCallback(list, error) { 
     $log.error('Somehting went wrong while loading json.'); 
     $log.log(list, error); 
    } 

    function successCallback(list, response) { 
     $log.info('JSON loaded successfully.'); 
     //$log.log(list, response); 
     //this works 
     //$scope.list = list.concat(response.data); 
     //this doesn't 
     list = list.concat(response.data); 
     $log.log($scope.list, list); 
    } 

これは、私はそれらを結合しています方法です。しかし、私がlistを更新すると、渡される実際のパラメータは更新されないという懸念があります。私はバインドのパラメータをバインドするときに、値または参照を使用してバインドされていることを知りたいですか?ここにはplunkrがあります。

答えて

4

JavaScriptのすべてが値渡しされます。これらの値の中には、変更可能なもの(オブジェクト - 参照値とも呼ばれます)への参照がありますが、それだけです。 listに再割り当てすると、ローカルスコープのlist変数は変更されません。あなたは実際にconcatが行っていない配列を変異させる必要があります - 代わりにpushを使用してください。

$scopeを変更する場合は、それ自体を渡して、.listプロパティを明示的に割り当てる必要があります。

+0

** JavaScriptのすべてに値**が渡されます。私はオブジェクトが参照によって渡されると思う。 – murli2308

+1

@ murli2308:だからこそ、私はそれを明示した。なぜなら、多くの人がそれを信じていないからだ。オブジェクトはまだ値渡しの参照値です。パラメータ変数にはオブジェクトへの参照(値)が含まれていますが、これは "渡された変数"への参照ではありません。変数 'list'に代入するのは、その変数がオブジェクト(配列)を含んでいるかどうかにかかわらず変更されるだけです。 – Bergi

+0

ご清聴ありがとうございます。 – murli2308

1

Function.prototype.bindは、呼び出しまたは適用と同じことを行いますが、すぐに関数を呼び出すのではなく、新しい関数を返します。パラメータはこれにバインドされており、関数が新しいスコープまたはコンテキストから呼び出されると、同じ。バインディング

はまた、あなたが、それは常にcallまたはapplyを経由してこれを上書きしようとするために送信するもの誰かに関係なく、このためにバインドさのパラメータを使用しませんので、applyまたはcallで「ハッキング」されているから、あなたのコンストラクタを防ぐことができます。あなたが指摘している場合は、我々はcall経由overrideそれにしようとしていても

は、最後のものはguestからrajiniに変更されません。

function Profile(u) { 
    this.user = u; 
    this.getUser = function() { 
     return this.user; 
    }; 
} 

var x = new Profile('guest'); 

alert(x.getUser.apply({ 
    user: 'Vinoth' 
})); // Vinoth 
alert(x.getUser.call({ 
    user: 'Google' 
})); // Google 
alert(x.getUser.bind(x).call({ 
    user: 'Rajini' 
})); // guest 

再生するためのフィドル。 https://jsfiddle.net/5qxpn4v0/

関連する問題