Is Javascript绑定由值调用

Is Javascript bind is call by value?

本文关键字:值调用 绑定 Javascript Is      更新时间:2024-01-19

我正在学习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 时,它不会更新传递的实际参数。我想知道,当我们为绑定绑定参数时,它们是使用值还是引用绑定的?这是plunkr。

JavaScript中的所有内容都是通过值传递的。其中一些值可以是对可变事物(对象,也称为引用值)的引用,但仅此而已。当您重新分配给list时,除了本地作用域中的list变量外,什么都不会改变。实际上,您需要对数组进行突变,而concat并没有这样做,而是使用push

如果要对$scope进行变异,则需要将其自身传递并显式分配其.list属性。

Function.prototype.bind执行与调用或应用相同的操作,但不会立即调用函数,而是返回一个新函数,其中参数绑定到该函数,当从新作用域或上下文调用该函数时,它将保持不变。

绑定还允许您防止您的构造函数被applycall"入侵",因为无论有人通过callapply发送什么试图覆盖它,它都将始终使用绑定的参数。

如果您已经注意到,即使我们尝试通过calloverride,最后一个也不会从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/