Cá nhân tôi không thích chức năng "Pass By tham khảo" được cung cấp bởi các ngôn ngữ lập trình khác nhau. Có lẽ đó là bởi vì tôi chỉ khám phá ra các khái niệm về lập trình chức năng, nhưng tôi luôn bị nổi da gà khi thấy các chức năng gây ra tác dụng phụ [như thao tác các tham số được truyền qua tham chiếu]. Cá nhân tôi nắm bắt mạnh mẽ nguyên tắc "trách nhiệm duy nhất".
IMHO, một hàm sẽ trả về chỉ một kết quả/giá trị bằng cách sử dụng từ khóa trả về. Thay vì sửa đổi một tham số/đối số, tôi sẽ trả về giá trị tham số/đối số đã sửa đổi và để lại bất kỳ công việc phân công mong muốn nào lên đến mã gọi.
Nhưng đôi khi [hy vọng rất hiếm khi], cần phải trả về hai hoặc nhiều giá trị kết quả từ cùng một hàm. Trong trường hợp đó, tôi sẽ chọn bao gồm tất cả các giá trị kết quả đó trong một cấu trúc hoặc đối tượng. Một lần nữa, việc xử lý bất kỳ công việc chỉ định lại nên tùy thuộc vào mã gọi.
Example:
Giả sử các tham số truyền sẽ được hỗ trợ bằng cách sử dụng từ khóa đặc biệt như 'ref' trong danh sách đối số. Mã của tôi có thể trông giống như thế này:
//The Function
function doSomething[ref value] {
value = "Bar";
}
//The Calling Code
var value = "Foo";
doSomething[value];
console.log[value]; //Bar
Thay vào đó, tôi thực sự muốn làm một cái gì đó như thế này:
//The Function
function doSomething[value] {
value = "Bar";
return value;
}
//The Calling Code:
var value = "Foo";
value = doSomething[value]; //Reassignment
console.log[value]; //Bar
Khi tôi cần viết một hàm trả về nhiều giá trị, tôi cũng sẽ không sử dụng các tham số được truyền bằng tham chiếu. Vì vậy, tôi sẽ tránh mã như thế này:
//The Function
function doSomething[ref value] {
value = "Bar";
//Do other work
var otherValue = "Something else";
return otherValue;
}
//The Calling Code
var value = "Foo";
var otherValue = doSomething[value];
console.log[value]; //Bar
console.log[otherValue]; //Something else
Thay vào đó, tôi thực sự muốn trả về cả hai giá trị mới bên trong một đối tượng, như thế này:
//The Function
function doSomething[value] {
value = "Bar";
//Do more work
var otherValue = "Something else";
return {
value: value,
otherValue: otherValue
};
}
//The Calling Code:
var value = "Foo";
var result = doSomething[value];
value = result.value; //Reassignment
console.log[value]; //Bar
console.log[result.otherValue];
Những ví dụ mã này khá đơn giản, nhưng nó chứng minh cách cá nhân tôi sẽ xử lý những thứ như vậy. Nó giúp tôi giữ các trách nhiệm khác nhau ở đúng nơi.
Mã hóa hạnh phúc. :]
Trong bài đăng này, chúng tôi sẽ xem xét vượt qua giá trị và vượt qua tham chiếu trong JavaScript.
Hãy cùng xem những gì được truyền qua giá trị và vượt qua tham chiếu trước khi xem xét bối cảnh JavaScript của nó.
Vượt qua giá trị:
Trong Pass by giá trị, hàm được gọi bằng cách truyền trực tiếp giá trị của biến làm đối số. Thay đổi đối số bên trong hàm không ảnh hưởng đến biến được truyền từ bên ngoài hàm.
JavaScript luôn vượt qua giá trị để thay đổi giá trị của biến không bao giờ thay đổi nguyên thủy cơ bản [chuỗi hoặc số]. so changing the value of the variable never changes the underlying primitive [String or number].
function callByValue[varOne, varTwo] {
console.log["Inside Call by Value Method"];
varOne = 100;
varTwo = 200;
console.log["varOne =" + varOne +"varTwo =" +varTwo];
} let varOne = 10;
let varTwo = 20; console.log["Before Call by Value Method"];
console.log["varOne =" + varOne +"varTwo =" +varTwo]; callByValue[varOne, varTwo] console.log["After Call by Value Method"];
console.log["varOne =" + varOne +"varTwo =" +varTwo];
output will be :
---------------
Before Call by Value Method
varOne =10 varTwo =20
Inside Call by Value Method
varOne =100 varTwo =200
After Call by Value Method
varOne =10 varTwo =20
Tuy nhiên, khi một biến đề cập đến một đối tượng bao gồm mảng, giá trị là tham chiếu đến đối tượng.
Vượt qua tham chiếu:
Trong tham chiếu vượt qua, hàm được gọi bằng cách truyền trực tiếp tham chiếu/địa chỉ của biến làm đối số. Thay đổi đối số bên trong hàm ảnh hưởng đến biến được truyền từ bên ngoài hàm. Trong các đối tượng và mảng JavaScript theo sau vượt qua tham chiếu.
function callByReference[varObj] {
console.log["Inside Call by Reference Method"];
varObj.a = 100;
console.log[varObj];
}
let varObj = {a:1};console.log["Before Call by Reference Method"];
console.log[varObj];callByReference[varObj] console.log["After Call by Reference Method"];
console.log[varObj];output will be :
--------------- Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
Vì vậy, nếu chúng ta chuyển đối tượng hoặc mảng làm đối số cho phương thức, thì có khả năng giá trị của đối tượng có thể thay đổi.
Nếu bạn muốn tạo trang web hoặc cổng thông tin - liên hệ với chúng tôi @ //www.bondesk.in