2016-04-06 25 views
0

bind, call ve apply işlevlerini öğreniyorum. API çağrıları için geri arama ayarlamak için bind kullanıyorum.Javascript bağlama değeri değere göre mi?

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); 
    } 

Bu onları bağlayıcı am nasıl: İşte benim fonksiyonları

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

Ben geri arama olarak kullandığınızda:

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

Onlar düzgün çağrılan alıyorsanız. Ancak endişe, list'u güncellediğimde, iletilen gerçek parametreyi güncellememesidir. Bağlamak için parametreleri bağladığımızda, değer veya referans kullanarak bağlı olduklarını bilmek isterim? İşte plunkr.

cevap

4

JavaScript'teki her şey değere göre geçirilir. Bu değerlerden bazıları, değişebilir şeylere referanslar olabilir (nesneler - referans değerleri olarak da adlandırılır), ama budur. list'a yeniden atandığınızda, hiçbir şey değişmiyor ancak yerel kapsamınızda list değişkeni değişiyor. Aslında, concat'un yapamayacağı dizininizi değiştirmeniz gerekecek - bunun yerine push'u kullanın.

$scope'u değiştirmek istiyorsanız, kendisini iletmeniz ve .list özelliğini açıkça atamanız gerekir.

+0

** ** JavaScript'teki her şey değerden geçmiştir **. Nesnelerin referans olarak geçtiğini düşünüyorum – murli2308

+1

@ murli2308: Bu yüzden bunu açıkça söyledim - çünkü pek çoğu buna inanmıyor. Nesneler, hala değer tarafından geçirilen referans değerleridir. Parametre değişkeni, nesneye bir referans (değer) içerir, "geçirilen değişken" için bir başvuru değildir. 'List' değişkenine atama, yalnızca bir değişkenin (array) olup olmadığına bakılmaksızın o değişkeni değiştirir. – Bergi

+0

Açıklama için teşekkürler. – murli2308

1

Function.prototype.bind, çağrı veya uygulama ile aynı şeyi yapar, ancak işlevi hemen çağırmaz; bunun yerine, buna bağlı parametrelerinizle yeni bir işlev döndürür ve işlev yeni bir kapsam veya bağlamdan çağrıldığında, aynı. Cilt

ayrıca her zaman call veya apply yoluyla bu geçersiz girişiminde gönderdiği birisi olursa olsun bunun için binded parametreleri kullanacağından apply veya call tarafından "hack" olmaktan kurucular önlemek için izin verir. Eğer kaydetti varsa biz call aracılığıyla override o deneyin rağmen

, sonuncusu guest den rajini için değişmez.

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 

Çevrede oynamak için bir keman. https://jsfiddle.net/5qxpn4v0/

İlgili konular