Is Javascript绑定由值调用
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
时,它不会更新传递的实际参数。我想知道,当我们为绑定绑定参数时,它们是使用值还是引用绑定的?这是plunkr。
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/
相关文章:
- 将值动态绑定到jquery中的切换按钮
- 在extJS 4.2中,有没有一种方法可以将模型值动态绑定到表单
- 如何调用绑定到angular元素的java脚本函数
- 谷歌应用程序脚本:如何在没有用户交互的情况下调用绑定到处理程序的函数
- 如何使用 AngularJS 将值动态绑定到链接
- Javascript 将函数调用绑定到 id
- 通过“调用”绑定“这个”不起作用
- 调用/绑定/应用与原型
- 敲除类的动态表达式值 - CSS 绑定
- 角度-引导-滑块默认值/双向绑定
- 如何:如果调用了函数(param),则将unforeunload调用绑定到窗口
- 从绑定到某个事件的另一个函数调用绑定到某一事件的函数是't工作
- 未调用绑定到foreach中单击操作的函数
- 选项值数据绑定不起作用
- 函数调用绑定的不同
- 值没有绑定到角自定义单选按钮组件中
- foreach绑定中选择选项和值的绑定
- 动态创建的js脚本onClick函数变量在当前值不绑定
- 不能使用keyup给属性赋新值.在绑定到该属性的输入上输入事件
- 用一次调用绑定多个类的单击事件