Tại sao bất kỳ mã JavaScript nào muốn để cắt giảm ràng buộc ràng buộc?


10

Lý do sử dụng một

(0, foo.fn)();

là để cắt ràng buộc : ý thischí không còn bị ràng buộc foomà sẽ bị ràng buộc với đối tượng toàn cầu.

Nhưng lý do tại sao bất kỳ mã JavaScript nào (hoặc mã JS của Google) muốn cắt liên kết là gì? (và nó có phải là một mô hình chống hay không?)


gọi nó là một ràng buộc không cảm thấy đúng. bindphương pháp liên kết. Đây chỉ là một sự thay đổi bối cảnh. Bạn không thể cắt hoặc mất ràng buộc (trái phiếu được tạo bởi bind).
marzelin

có lẽ mã này được tạo bởi một bộ chuyển mã từ một số ngôn ngữ chức năng (clojurescript?) có các yêu cầu cụ thể khi nói đến các hàm gọi?
marzelin

có thể trùng lặp tại sao babel viết lại hàm nhập khẩu gọi tới (0, fn) (trên)? - hoặc nơi nào khác bạn đang thấy điều này?
Bergi

Tôi nghĩ rằng tôi đã thấy nó trong mã của Google và có thể trong một số khung như Angular, React hoặc một số khác ... không thể nhớ lại ở đâu và đôi khi nó được
rút ngắn

Câu trả lời:


8

Loại mã này thường được tạo bởi các bộ chuyển đổi (như Babel), để chuyển đổi JavaScript hiện đại - sử dụng các bổ sung gần đây nhất cho đặc tả - thành phiên bản JavaScript được hỗ trợ rộng rãi hơn.

Dưới đây là một ví dụ nơi mô hình dịch chuyển này xảy ra:

Giả sử chúng ta có mã gốc này trước khi dịch mã:

import {myfunc} from "mymodule";
myfunc();

Để tạo mã tương thích ES5 này, bạn có thể làm điều này:

"use strict";    
var mymodule = require("mymodule");    
mymodule.myfunc();

Nhưng ở đây chúng tôi sẽ thực hiện myfuncvới mymodulenhư thisgiá trị, mà không xảy ra trong mã gốc. Và mặc dù điều đó có thể không phải luôn luôn là một vấn đề, tốt hơn là đảm bảo rằng chức năng này hoạt động giống như trong phiên bản gốc , ngay cả khi chức năng đó sẽ sử dụng một thistham chiếu - việc sử dụng thistrong đó myfunccó thể bất thường hoặc thậm chí vô dụng như thế nào ( bởi vì trong phiên bản gốc cũng vậy undefined).

Vì vậy, ví dụ, nếu mã gốc sẽ gây ra lỗi do this.memberFun()tham chiếu trong hàm, thì nó cũng sẽ ném trong phiên bản được phiên mã.

Vì vậy, đó là toán tử dấu phẩy được sử dụng để loại bỏ sự khác biệt đó:

(0, mymodule.myfunc)();

Cấp, trong mã mà bạn tự viết, bạn sẽ không bao giờ có trường hợp sử dụng tốt cho mẫu này, vì bạn sẽ không sử dụng thismyfuncnơi đầu tiên.


Làm thế nào có requireliên quan đến ES6 hoặc ES5? Tôi đã từng nghĩ rằng yêu cầu là một mô-đun nút.
Connexo

requirethực sự là một hàm có sẵn trong nút hoặc loại khác được cung cấp trong các thư viện như browserify, allow.js, ... vv. Nó không liên quan cụ thể đến ES5 / 6. Mặt khác, cấu trúc ngôn ngữ ES6 + như importkhông thể được nhập vào ES5 mà không có gì giống như dịch chuyển.
trincot

Vì vậy, nếu cô đọng nó thành một vài dòng tóm tắt: nếu đó là một thư viện hoặc mô-đun bao gồm nhiều hàm không thực sự là phương thức hoặc OO, (dưới dạng modA.fn1), thì các hàm này thực sự không nên sử dụng thisnhưng nếu vô tình họ làm, chúng tôi không muốn thisảnh hưởng đến mô-đun theo bất kỳ cách nào như là một tác dụng phụ, vì vậy chúng tôi đã cắt liên kết, làm cho nó hoạt động như thế nào nếu nó là một chức năng độc lập
phân cực

Vâng, đó thực sự là cách bạn có thể tóm tắt nó. Một lần nữa, điều này chủ yếu là mối quan tâm đối với các bộ chuyển mã, không quá nhiều của một lập trình viên.
trincot
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.