7 Mayıs 2019 Salı

Function Binding

JavaScript Late Binding Kullanır
Açıklaması şöyle.
In languages like Ruby or Java, this (or in case of Ruby self) will always point to the object in which your method is defined. So in Ruby if you are working on the foo method inside the Bar class, self will always point to the object which is the instance of the Bar class.

JavaScript works quite surprisingly here. Because in JavaScript function context is defined while calling the function, not while defining it! This is what can surprise many when coming to JS from different fields. Such late binding is a powerful mechanism which allows us to re-use loosely coupled functions in variety of contexts.
4 Tane Late Binding Yöntemi Var
Function çağrılarında 4 tane şeyi bilmek gerekiyor.
-function invocation pattern
-method invocation pattern
-constructor invocation pattern
-apply invocation pattern
Function Invocation Pattern
Açıklaması şöyle. Function'ın önünde bir şey olmadan direkt çağrılması.
If there are no dots in your function call, your context is likely to be window.
Function Invocation Pattern
Açıklaması şöyle. Function'ın bir nesnenin parçası gibi çağrılması. foo.bar() gibi
If there are dots in your function call, your function context will be the right-most element of your dots chain.
Constructor Invocation Pattern
Açıklaması şöyle. Function'ın içinde bir başka function tanımlıdır. new'lenerek yaratılır ve new'lenen function içindeki function çağrılır.
Every time you see a new followed by a function name, your this will point to a newly created empty object.
Apply Invocation Pattern
Function'ın call() veya apply() metodları çağrılır ve this olacak nesne parametre olarak geçilir.
Function call metodu yazısına bakabilirsiniz.

Function.prototype.bind metodu
Açıklaması şöyle.
The bind() method creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.
Bound Function'ların prototype alanı yoktur. Açıklaması şöyle.
...bound functions don't have a .prototype property because they don't need it. When you call a bound function with new, it calls the original function as a constructor, using the original's .prototype object as the prototype of the new instance.

In fact, since ECMAScript 6 many functions don't have a .prototype property with an object, because they are not constructors - they cannot be called with new so they don't need it. Among those are

- arrow functions (() => {…})
- methods (method() { … } in object literals and classes)
- builtin non-constructor functions (like Math.sin)
Örnek
Bağlamak için şöyle yaparız. foo fuction'ı içindeki this bundan sonra obj1'i gösterir.
function foo(something) {
  this.a = something;
}

var obj1 = {};

var bar = foo.bind(obj1);
Kullanmak için şöyle yaparız.
bar(2);
console.log(obj1.a); // 2

Hiç yorum yok:

Yorum Gönder