[英]Is Javascript bind is call by value?
我正在學習bind
, call
和apply
函數。 我正在使用bind為api調用設置回調。 這是我的功能:
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);
}
這就是我綁定它們的方式:
var successCb = successCallback.bind(null, $scope.list),
errorCb = errorCallback.bind(null, $scope.list);
當我將它們用作回調時:
$scope.loadJson = function() {
$http.get('data.json').then(successCb, errorCb);
};
它們被正確調用。 但是令人擔心的是,當我更新list
,它不會更新所傳遞的實際參數。 我想知道,當我們為綁定綁定參數時,它們是使用值還是引用進行綁定? 這是小矮人 。
JavaScript中的所有內容都是按值傳遞的。 其中一些值可以引用可變的事物(對象-也稱為引用值),僅此而已。 當您重新分配給list
,除了本地作用域中的list
變量外,什么都沒有改變。 實際上,您實際上需要對數組進行突變,而concat
則不行,請改用push
。
如果要更改$scope
,則需要自己傳遞它並顯式分配其.list
屬性。
Function.prototype.bind
作用與調用或應用相同,但不會立即調用該函數,而是返回綁定了此參數的新函數,並且從新作用域或上下文調用該函數時,它將保留相同。
綁定還可以防止您的構造函數被apply
或call
所“黑客入侵”,因為無論有人發送什么內容來嘗試通過call
或apply
覆蓋它,它都將始終使用綁定的參數。
如果您已經注意到,即使我們嘗試通過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/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.