簡體   English   中英

Javascript綁定是按值調用嗎?

[英]Is Javascript bind is call by value?

我正在學習bindcallapply函數。 我正在使用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作用與調用或應用相同,但不會立即調用該函數,而是返回綁定了此參數的新函數,並且從新作用域或上下文調用該函數時,它將保留相同。

綁定還可以防止您的構造函數被applycall所“黑客入侵”,因為無論有人發送什么內容來嘗試通過callapply覆蓋它,它都將始終使用綁定的參數。

如果您已經注意到,即使我們嘗試通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM