Chức năng Javascript với các tham số. Hàm lượng giác nghịch đảo. chức năng là gì

Cập nhật lần cuối: 09/04/2018

Hàm là một tập hợp các hướng dẫn thực hiện một hành động cụ thể hoặc tính toán một giá trị cụ thể.

Cú pháp định nghĩa hàm:

Hàm function_name([parameter [, ...]])( // Hướng dẫn )

Định nghĩa hàm bắt đầu bằng từ khóa function, theo sau là tên của hàm. Tên hàm tuân theo các quy tắc giống như tên biến: nó chỉ có thể chứa số, chữ cái, dấu gạch dưới và ký tự đô la ($) và phải bắt đầu bằng một chữ cái, dấu gạch dưới hoặc đô la.

Sau tên hàm, các tham số được liệt kê trong ngoặc đơn. Ngay cả khi một hàm không có tham số thì nó chỉ chứa các dấu ngoặc đơn trống. Sau đó, trong dấu ngoặc nhọn là phần thân hàm chứa một tập hợp các lệnh.

Hãy xác định hàm đơn giản nhất:

Hàm display())( document.write("function in JavaScript"); )

Hàm này được gọi là hiển thị(). Nó không chấp nhận bất kỳ tham số nào và tất cả những gì nó làm là viết một chuỗi lên trang web.

Tuy nhiên, chỉ xác định một hàm là không đủ để làm cho nó hoạt động. Bạn vẫn cần gọi cho cô ấy:

hàm display())( document.write("hàm trong JavaScript"); ) display();

Không cần thiết phải đặt tên cụ thể cho các chức năng. Bạn có thể sử dụng các chức năng ẩn danh:

Var display = function())( // định nghĩa hàm document.write("function in JavaScript"); ) display();

Những gì chúng ta đang làm thực chất là xác định một biến hiển thị và gán cho nó một tham chiếu hàm. Và sau đó hàm được gọi dựa trên tên biến.

Chúng ta cũng có thể gán động các hàm cho một biến:

Hàm goodMorning())( document.write("Chào buổi sáng"); ) function goodEvening())( document.write("Chào buổi tối"); ) var message = goodMorning; tin nhắn(); // Tin nhắn chào buổi sáng = goodEvening; tin nhắn(); // Buổi tối vui vẻ

Thông số chức năng

Hãy xem xét việc truyền tham số:

Hàm display(x)( // định nghĩa hàm var z = x * x; document.write(x + " bình phương bằng " + z); ) display(5); // gọi hàm

Hàm hiển thị có một tham số - x. Do đó, khi gọi một hàm, chúng ta có thể truyền một giá trị cho nó, ví dụ như số 5, như trong trường hợp này.

Nếu một hàm nhận nhiều tham số, thì bằng cách sử dụng toán tử trải... chúng ta có thể truyền một tập hợp các giá trị cho các tham số này từ một mảng:

Hàm sum(a, b, c)( let d = a + b + c; console.log(d); ) sum(1, 2, 3); để số = ; tổng (...số);

Trong trường hợp thứ hai, các số từ mảng nums được truyền vào hàm. Nhưng để truyền không chỉ một mảng dưới dạng một giá trị mà còn truyền các số từ mảng này, toán tử trải (dấu chấm lửng...) được sử dụng.

Thông số tùy chọn

Một hàm có thể nhận nhiều tham số, nhưng một số hoặc tất cả các tham số có thể là tùy chọn. Nếu không có giá trị nào được truyền cho tham số, chúng sẽ mặc định là "không xác định".

Hàm display(x, y)( if(y === unfined) y = 5; if(x === unfined) x = 8; let z = x * y; console.log(z); ) display() ; // 40 hiển thị(6); // 30 hiển thị(6, 4) // 24

Ở đây chức năng hiển thị có hai tham số. Khi gọi một hàm, chúng ta có thể kiểm tra giá trị của chúng. Tuy nhiên, khi gọi một hàm, không nhất thiết phải truyền giá trị cho các tham số này. Để kiểm tra sự hiện diện của một giá trị tham số, người ta sử dụng phép so sánh với giá trị không xác định.

Có một cách khác để xác định giá trị mặc định cho tham số:

Hàm display(x = 5, y = 10)( let z = x * y; console.log(z); ) display(); // 50 hiển thị(6); // 60 hiển thị(6, 4) // 24

Nếu không có giá trị nào được truyền cho tham số x và y thì chúng sẽ thu được lần lượt là giá trị của số 5 và 10. Phương pháp này ngắn gọn và trực quan hơn so với việc so sánh với phương pháp không xác định.

Trong trường hợp này, giá trị mặc định của tham số có thể được suy ra, biểu thị biểu thức:

Hàm display(x = 5, y = 10 + x)( let z = x * y; console.log(z); ) display(); // 75 hiển thị(6); // 96 hiển thị(6, 4) // 24

Trong trường hợp này, giá trị của tham số y phụ thuộc vào giá trị của x.

Nếu cần, chúng ta có thể lấy tất cả các tham số được truyền thông qua mảng đối số có thể truy cập toàn cầu:

Hàm display())( var z = 1; for(var i=0; i target) trả về null; ngược lại trả về find(start + 5, "(" + history + " + 5)") || find(start * 3 , "(" + history + " * 3)"); ) return find(1, "1"); ) console.log(findSolution(24)); // → (((1 * 3) + 5) * 3)

Ví dụ này không nhất thiết phải tìm ra giải pháp ngắn nhất - nó phù hợp với bất kỳ ví dụ nào. Tôi không mong đợi bạn hiểu ngay cách thức hoạt động của chương trình. Nhưng chúng ta hãy hiểu bài tập tuyệt vời này về tư duy đệ quy.

Hàm bên trong find thực hiện đệ quy. Phải mất hai đối số - số hiện tại và một chuỗi chứa bản ghi về cách chúng tôi đạt đến số này. Và nó trả về một chuỗi hiển thị trình tự các bước của chúng tôi hoặc trả về giá trị rỗng.

Để làm điều này, hàm thực hiện một trong ba hành động. Nếu con số đã cho bằng với mục tiêu thì câu chuyện hiện tại chính là cách để đạt được nó nên nó sẽ quay trở lại. Nếu con số đã cho lớn hơn mục tiêu thì việc tiếp tục nhân và cộng cũng chẳng ích gì, vì nó sẽ chỉ tăng lên mà thôi. Và nếu chúng ta chưa đạt được mục tiêu, hàm sẽ thử cả hai đường dẫn có thể bắt đầu bằng số đã cho. Cô triệu hồi chính mình hai lần, một lần với mỗi phương pháp. Nếu cuộc gọi đầu tiên không trả về null thì nó sẽ được trả về. Trong trường hợp khác, cái thứ hai được trả lại.

Để hiểu rõ hơn về cách hàm đạt được hiệu quả mong muốn, chúng ta hãy xem các lệnh gọi mà nó thực hiện để tìm giải pháp cho số 13.

Tìm(1, "1") find(6, "(1 + 5)") find(11, "((1 + 5) + 5)") find(16, "(((1 + 5) + 5 ) + 5)") quá lớn find(33, "(((1 + 5) + 5) * 3)") quá lớn find(18, "((1 + 5) * 3)") quá lớn find( 3, "(1 * 3)") find(8, "((1 * 3) + 5)") find(13, "(((1 * 3) + 5) + 5)") đã tìm thấy!

Việc thụt lề cho thấy độ sâu của ngăn xếp cuộc gọi. Lần đầu tiên, hàm find tự gọi hai lần để kiểm tra các nghiệm bắt đầu bằng (1 + 5) và (1 * 3). Lệnh gọi đầu tiên tìm kiếm giải pháp bắt đầu bằng (1 + 5) và sử dụng đệ quy để kiểm tra tất cả các giải pháp tạo ra số nhỏ hơn hoặc bằng số được yêu cầu. Không tìm thấy nó và trả về null. Sau đó, toán tử || và chuyển sang lệnh gọi hàm để kiểm tra tùy chọn (1 * 3). Ở đây chúng ta thật may mắn vì trong lệnh gọi đệ quy thứ ba, chúng ta nhận được 13. Lệnh gọi này trả về một chuỗi và mỗi || trên đường đi nó vượt qua đường này cao hơn, dẫn đến việc trả về một nghiệm.

Phát triển các hàm Có hai cách ít nhiều tự nhiên để đưa các hàm vào một chương trình.

Đầu tiên là bạn viết mã tương tự nhiều lần. Nên tránh điều này - nhiều mã hơn có nghĩa là có nhiều chỗ hơn cho lỗi và nhiều tài liệu đọc hơn cho những người đang cố gắng hiểu chương trình. Vì vậy, chúng tôi lấy một hàm định kỳ, đặt cho nó một cái tên hay và đặt nó vào một hàm.

Cách thứ hai là bạn phát hiện ra nhu cầu về một số chức năng mới xứng đáng được đặt vào một chức năng riêng biệt. Bạn bắt đầu bằng tên của hàm, sau đó viết nội dung của nó. Bạn thậm chí có thể bắt đầu bằng cách viết mã sử dụng hàm trước khi chính hàm đó được xác định.

Việc bạn đặt tên cho một chức năng khó đến mức nào cho thấy bạn hiểu rõ chức năng của nó đến mức nào. Hãy lấy một ví dụ. Chúng ta cần viết chương trình in ra hai số, số bò và số gà trong trang trại, theo sau là các từ “bò” và “gà”. Bạn cần thêm các số 0 vào các số đứng trước sao cho mỗi số chiếm đúng ba vị trí.

007 Con Bò 011 Con Gà

Rõ ràng, chúng ta cần một hàm có hai đối số. Hãy bắt đầu viết mã.
// print Hàm FarmInventory printFarmInventory(bò, gà) ( var cowString = String(cows); while (cowString.length< 3) cowString = "0" + cowString; console.log(cowString + " Коров"); var chickenString = String(chickens); while (chickenString.length < 3) chickenString = "0" + chickenString; console.log(chickenString + " Куриц"); } printFarmInventory(7, 11);

Nếu chúng ta thêm .length vào một chuỗi, chúng ta sẽ có được độ dài của chuỗi đó. Hóa ra là vòng lặp while thêm các số 0 đứng đầu vào các số cho đến khi chúng nhận được một dòng gồm 3 ký tự.

Sẵn sàng! Nhưng ngay khi chúng tôi chuẩn bị gửi mã cho người nông dân (tất nhiên là cùng với một tấm séc khổng lồ), anh ấy gọi và nói với chúng tôi rằng anh ấy có lợn trong trang trại của mình và liệu chúng tôi có thể thêm màn hình hiển thị số lượng lợn vào trang trại của mình không? chương trình?

Tất nhiên là có thể. Nhưng khi bắt đầu sao chép và dán mã từ bốn dòng này, chúng tôi nhận ra rằng mình cần phải dừng lại và suy nghĩ. Phải có cách tốt hơn. Chúng tôi đang cố gắng cải thiện chương trình:

// đầu ra VỚI Thêm số 0 VÀ Hàm nhãn printZeroPaddWithLabel(number, label) ( var numberString = String(number); while (numberString.length< 3) numberString = "0" + numberString; console.log(numberString + " " + label); } // вывестиИнвентаризациюФермы function printFarmInventory(cows, chickens, pigs) { printZeroPaddedWithLabel(cows, "Коров"); printZeroPaddedWithLabel(chickens, "Куриц"); printZeroPaddedWithLabel(pigs, "Свиней"); } printFarmInventory(7, 11, 3);

Làm! Nhưng cái tên printZeroP AddedWithLabel hơi lạ. Nó kết hợp ba thứ—đầu ra, thêm số 0 và nhãn—vào một hàm. Thay vì chèn toàn bộ đoạn lặp lại vào một hàm, hãy làm nổi bật một khái niệm:

// thêm hàm Zero zeroPad(number, width) ( var string = String(number); while (string.length< width) string = "0" + string; return string; } // вывестиИнвентаризациюФермы function printFarmInventory(cows, chickens, pigs) { console.log(zeroPad(cows, 3) + " Коров"); console.log(zeroPad(chickens, 3) + " Куриц"); console.log(zeroPad(pigs, 3) + " Свиней"); } printFarmInventory(7, 16, 3);

Một hàm có tên zeroPad hay, rõ ràng giúp mã dễ hiểu hơn. Và nó có thể được sử dụng trong nhiều tình huống, không chỉ trong trường hợp của chúng tôi. Ví dụ: để hiển thị các bảng được định dạng bằng số.

Các tính năng nên thông minh và linh hoạt như thế nào? Chúng ta có thể viết một hàm đơn giản đệm một số có số 0 lên đến ba vị trí hoặc một hàm mục đích chung phức tạp để định dạng các số hỗ trợ phân số, số âm, căn chỉnh dấu chấm, phần đệm, v.v.

Một nguyên tắc nhỏ là chỉ thêm chức năng mà bạn biết sẽ hữu ích. Đôi khi việc tạo ra các khuôn khổ có mục đích chung cho mọi nhu cầu nhỏ là điều rất hấp dẫn. Chống lại anh ta. Bạn sẽ không bao giờ hoàn thành công việc mà cuối cùng bạn sẽ chỉ viết một đống mã mà không ai sử dụng.

Hàm và tác dụng phụ Hàm có thể được chia đại khái thành những hàm được gọi vì tác dụng phụ của chúng và những hàm được gọi để đạt được một số giá trị. Tất nhiên, cũng có thể kết hợp các thuộc tính này trong một hàm.

Hàm trợ giúp đầu tiên trong ví dụ về trang trại, printZeroP AddedWithLabel, được gọi vì nó có tác dụng phụ: nó in một chuỗi. Thứ hai, zeroPad, vì giá trị trả về. Và không phải ngẫu nhiên mà chức năng thứ hai lại hữu ích thường xuyên hơn chức năng đầu tiên. Các hàm trả về giá trị dễ kết hợp với nhau hơn các hàm tạo ra tác dụng phụ.

Hàm thuần túy là một loại hàm trả về giá trị đặc biệt, không những không có tác dụng phụ mà còn không phụ thuộc vào tác dụng phụ của phần còn lại của mã - ví dụ: nó không hoạt động với các biến toàn cục có thể vô tình đã thay đổi ở một nơi khác. Một hàm thuần túy, khi được gọi với cùng các đối số, sẽ trả về cùng một kết quả (và không làm gì khác) - điều này khá hay. Cô ấy rất dễ làm việc cùng. Lệnh gọi một hàm như vậy có thể được thay thế bằng kết quả công việc của nó mà không làm thay đổi ý nghĩa của mã. Khi muốn kiểm tra một hàm như vậy, bạn chỉ cần gọi nó và đảm bảo rằng nếu nó hoạt động trong một ngữ cảnh nhất định thì nó sẽ hoạt động trong mọi ngữ cảnh. Các hàm kém thuần túy hơn có thể trả về các kết quả khác nhau tùy thuộc vào nhiều yếu tố và có các tác dụng phụ khó kiểm tra và giải thích.

Tuy nhiên, bạn không nên xấu hổ khi viết các hàm không hoàn toàn thuần túy hoặc bắt đầu làm sạch mã thiêng liêng các hàm đó. Tác dụng phụ thường có lợi. Không có cách nào để viết một phiên bản sạch của hàm console.log và hàm này khá hữu ích. Một số thao tác được thể hiện dễ dàng hơn bằng cách sử dụng tác dụng phụ.

Tóm tắt Chương này đã chỉ cho bạn cách viết các hàm của riêng bạn. Khi từ khóa hàm được sử dụng làm biểu thức, trả về một con trỏ tới lệnh gọi hàm. Khi được sử dụng như một lệnh, bạn có thể khai báo một biến bằng cách gán lệnh gọi hàm cho biến đó.

Chìa khóa để hiểu các chức năng là phạm vi địa phương. Các tham số và biến được khai báo bên trong một hàm là cục bộ của hàm đó, được tạo lại mỗi khi hàm được gọi và không hiển thị từ bên ngoài. Các hàm được khai báo bên trong một hàm khác có quyền truy cập vào phạm vi của hàm đó.

Sẽ rất hữu ích nếu tách các nhiệm vụ khác nhau được thực hiện bởi một chương trình thành các chức năng. Bạn không cần phải lặp lại; các hàm giúp mã dễ đọc hơn bằng cách chia mã thành các phần có ý nghĩa, giống như các chương và phần của một cuốn sách giúp sắp xếp văn bản thông thường.

Bài tậpTối thiểu Trong chương trước, chúng ta đã đề cập đến hàm Math.min, hàm này trả về đối số nhỏ nhất của nó. Bây giờ chúng ta có thể tự viết một hàm như vậy. Viết hàm min nhận vào hai đối số và trả về giá trị nhỏ nhất của chúng.

Console.log(min(0, 10)); // → 0 console.log(min(0, -10)); // → -10

Đệ quy Chúng ta đã thấy rằng toán tử % (modulo) có thể được sử dụng để xác định xem một số (%2) có phải là số chẵn hay không. Đây là một cách khác để xác định nó:

Số không là chẵn.
Đơn vị này thật kỳ lạ.
Bất kỳ số N nào cũng có cùng tính chẵn lẻ với N-2.

Viết hàm đệ quy chẵn theo các quy tắc này. Nó phải chấp nhận một số và trả về giá trị boolean.

Kiểm tra nó ở mức 50 và 75. Hãy thử cho nó -1. Tại sao cô ấy lại hành động theo cách này? Có thể bằng cách nào đó sửa chữa nó?

Kiểm tra nó trên 50 và 75. Xem nó hoạt động như thế nào trên -1. Tại sao? Bạn có thể nghĩ ra cách để khắc phục điều này?

Console.log(isEven(50)); // → true console.log(isEven(75)); // → sai console.log(isEven(-1)); // → ??

Đếm hạt đậu.

Số ký tự N của một chuỗi có thể được lấy bằng cách thêm .charAt(N) (“chuỗi”.charAt(5)) vào chuỗi đó - theo cách tương tự như cách lấy độ dài của chuỗi bằng cách sử dụng .length. Giá trị trả về sẽ là một chuỗi gồm một ký tự (ví dụ: “k”). Ký tự đầu tiên của chuỗi có vị trí 0, nghĩa là ký tự cuối cùng sẽ có vị trí string.length - 1. Nói cách khác, một chuỗi gồm hai ký tự có độ dài 2, và vị trí ký tự của nó sẽ là 0 và 1.

Viết hàm countBs lấy một chuỗi làm đối số và trả về số ký tự “B” có trong chuỗi.

Sau đó viết một hàm tên là countChar, hàm này hoạt động giống như countBs, nhưng lấy tham số thứ hai - ký tự mà chúng ta sẽ tìm kiếm trong chuỗi (thay vì chỉ đếm số ký tự "B"). Để thực hiện việc này, hãy làm lại hàm countBs.

24 tháng 5 năm 2011 lúc 01:13 Năm cách gọi hàm
  • JavaScript
  • Dịch

Tôi thường gặp những đoạn mã JavaScript có lỗi do hiểu sai cách hoạt động của các hàm trong JavaScript (nhân tiện, phần lớn mã này là do tôi viết). JavaScript là một ngôn ngữ đa mô hình và nó có các cơ chế lập trình chức năng. Đã đến lúc khám phá những khả năng này. Trong bài viết này, tôi sẽ cho bạn biết năm cách để gọi hàm trong JavaScript.

Trong giai đoạn đầu học JavaScript, người mới bắt đầu thường nghĩ rằng các hàm trong nó hoạt động theo cách tương tự như trong C#. Nhưng cơ chế gọi hàm trong JavaScript có một số điểm khác biệt quan trọng và việc thiếu hiểu biết về chúng có thể dẫn đến những lỗi không dễ tìm thấy.

Hãy viết một hàm đơn giản trả về một mảng gồm ba phần tử - giá trị this hiện tại và hai đối số được truyền cho hàm.
hàm makeArray(arg1, arg2)( return [ this, arg1, arg2 ]; )

Cách phổ biến nhất: gọi toàn cục Người mới bắt đầu thường khai báo các hàm như trong ví dụ trên. Gọi hàm này rất dễ dàng:
makeArray("một", "hai"); // => [ cửa sổ, "một", "hai" ]
Chờ đợi. Đối tượng cửa sổ đến từ đâu? Tại sao điều này bằng với cửa sổ?

Trong JavaScript, bất kể tập lệnh được thực thi trong trình duyệt hay trong môi trường khác, nó luôn được xác định đối tượng toàn cầu. Bất kỳ mã nào trong tập lệnh của chúng tôi không bị "ràng buộc" với bất kỳ thứ gì (nghĩa là nằm ngoài phần khai báo đối tượng) thực sự nằm trong ngữ cảnh của đối tượng toàn cục. Trong trường hợp của chúng tôi, makeArray không chỉ là một chức năng “đi bộ” một mình. Trên thực tế, makeArray là một phương thức của đối tượng toàn cục (trong trường hợp thực thi mã trong trình duyệt) window . Thật dễ dàng để chứng minh:
cảnh báo (typeof window.methodThatDoesntExist); // => cảnh báo không xác định(typeof window.makeArray); // => hàm
Tức là gọi makeArray("one", "two"); tương đương với việc gọi window.makeArray("one", "two"); .

Điều làm tôi buồn là đây là cách gọi hàm phổ biến nhất, bởi vì nó hàm ý sự hiện diện của một hàm toàn cục. Và tất cả chúng ta đều biết rằng các hàm và biến toàn cục không phải là dạng tốt nhất trong lập trình. Điều này đặc biệt đúng với JavaScript. Tránh các định nghĩa toàn cầu và bạn sẽ không hối tiếc.

Quy tắc gọi hàm số 1: Nếu một hàm được gọi trực tiếp mà không chỉ định đối tượng (ví dụ: myFunction()), giá trị của hàm này sẽ là đối tượng chung (cửa sổ nếu mã được thực thi trong trình duyệt).

Gọi một Phương thức Hãy tạo một đối tượng đơn giản và tạo phương thức makeArray cho nó. Hãy khai báo đối tượng bằng cách sử dụng ký hiệu chữ và sau đó gọi phương thức của chúng ta:
// tạo một đối tượng var arrayMaker = ( someProperty: "some value", make: makeArray ); // gọi phương thức make() arrayMaker.make("one", "two"); // => [ arrayMaker, "one", "two" ] // cú pháp thay thế, sử dụng dấu ngoặc vuông arrayMaker["make"]("one", "two"); // => [ arrayMaker, "một", "hai" ]
Bạn có thấy sự khác biệt? Giá trị của this trong trường hợp này là chính đối tượng đó. Tại sao không phải là window , như trong trường hợp trước, vì khai báo hàm không thay đổi? Bí mật nằm ở cách các hàm được truyền trong JavaScript. Hàm là một loại JavaScript tiêu chuẩn thực sự là một đối tượng và giống như bất kỳ đối tượng nào khác, các hàm có thể được truyền đi và sao chép. Trong trường hợp này, về cơ bản, chúng tôi đã sao chép toàn bộ hàm, bao gồm danh sách đối số và nội dung, đồng thời gán đối tượng kết quả cho thuộc tính make của đối tượng arrayMaker. Điều này tương đương với một tuyên bố như thế này:
var arrayMaker = ( someProperty: "Some value"; make: function (arg1, arg2) ( return [ this, arg1, arg2]; ) );
Quy tắc gọi hàm số 2: Trong hàm được gọi bằng cú pháp gọi phương thức, chẳng hạn như obj.myFunction() hoặc obj["myFunction"]() , giá trị này sẽ có giá trị obj .

Hiểu sai nguyên tắc nhìn chung đơn giản này thường dẫn đến sai sót khi xử lý các sự kiện:
nút chức năngClicked())( var text = (this === window) ? "window" : this.id; cảnh báo (văn bản); ) var nút1 = document.getElementById("btn1"); nút var2 = document.getElementById("btn2"); nút1.onclick = nút Đã nhấp; nút2.onclick = function())( nútClicked(); );
Nhấp vào nút đầu tiên sẽ hiển thị một thông báo "btn1" bởi vì trong trường hợp này chúng ta đang gọi một hàm như một phương thức và cái này bên trong hàm sẽ lấy giá trị của đối tượng mà phương thức này thuộc về. Nhấp vào nút thứ hai sẽ cung cấp cho "cửa sổ" bởi vì trong trường hợp này chúng ta đang gọi trực tiếp nútClicked (tức là không giống như obj.buttonClicked()). Điều tương tự cũng xảy ra khi chúng ta gán một trình xử lý sự kiện cho thẻ phần tử, như trong trường hợp nút thứ ba. Nhấp vào nút thứ ba sẽ hiển thị thông báo tương tự như nút thứ hai.

Khi sử dụng các thư viện như jQuery, bạn không cần phải suy nghĩ về điều này. jQuery sẽ chú ý viết lại giá trị this trong trình xử lý sự kiện để giá trị this là phần tử phát sinh sự kiện:
// sử dụng jQuery $("#btn1").click(function() ( Alert(this.id); // jQuery sẽ đảm bảo "đây" là một nút ));
jQuery quản lý như thế nào để thay đổi giá trị của this ? Đọc dưới đây.

Hai cách nữa: apply() và call() Điều hợp lý là bạn càng sử dụng hàm thường xuyên thì bạn càng phải chuyển chúng và gọi chúng trong các ngữ cảnh khác nhau. Thường thì cần phải ghi đè giá trị của this . Nếu bạn còn nhớ, các hàm trong JavaScript là đối tượng. Trong thực tế, điều này có nghĩa là các hàm có các phương thức được xác định trước. apply() và call() là hai trong số đó. Chúng cho phép bạn ghi đè giá trị này:
var car = ( năm: 2008, model: "Dodge Bailout" ); makeArray.apply(xe, [ "một", "hai"]); // => [ car, "one", "two" ] makeArray.call(car, "one", "two"); // => [ ô tô, "một", "hai" ]
Hai phương pháp này rất giống nhau. Tham số đầu tiên ghi đè lên điều này. Sự khác biệt giữa chúng nằm ở các đối số tiếp theo: Function.apply() chấp nhận một mảng các giá trị sẽ được truyền cho hàm, trong khi Function.call() chấp nhận các đối số riêng biệt. Trong thực tế, theo tôi, sử dụng apply() sẽ thuận tiện hơn.

Quy tắc gọi hàm số 3: Nếu bạn muốn ghi đè giá trị của this mà không sao chép hàm sang đối tượng khác, bạn có thể sử dụng myFunction.apply(obj) hoặc myFunction.call(obj) .

Hàm tạo Tôi sẽ không đi sâu vào chi tiết về việc khai báo các kiểu tùy chỉnh trong JavaScript, nhưng tôi nghĩ điều quan trọng cần nhắc bạn là không có lớp nào trong JavaScript và bất kỳ kiểu tùy chỉnh nào cũng cần một hàm tạo. Ngoài ra, tốt hơn là khai báo các phương thức thuộc loại tùy chỉnh bằng cách sử dụng nguyên mẫu, đây là thuộc tính của hàm tạo. Hãy tạo kiểu riêng của chúng ta:
// khai báo hàm khởi tạo ArrayMaker(arg1, arg2) ( this.someProperty = "không quan trọng"; this.theArray = [ this, arg1, arg2 ]; ) // khai báo các phương thức ArrayMaker.prototype = ( someMethod: function () ( Alert( "Được gọi bởi someMethod"); ), getArray: function () ( return this.theArray; ) ); var am = new ArrayMaker("một", "hai"); var other = new ArrayMaker("đầu tiên", "thứ hai"); am.getArray(); // => [ sáng, "một", "hai" ]
Điều quan trọng trong ví dụ này là sự hiện diện của toán tử mới trước lệnh gọi hàm. Nếu không có nó, nó sẽ là một lệnh gọi toàn cục và các thuộc tính được tạo trong hàm tạo sẽ thuộc về đối tượng chung. Chúng tôi không cần điều đó. Ngoài ra, các hàm tạo thường không trả về giá trị một cách rõ ràng. Nếu không có toán tử new hàm tạo sẽ trả về unfind , cùng với nó nó sẽ trả về this . Việc đặt tên hàm tạo bằng chữ in hoa được coi là phong cách tốt; Điều này sẽ nhắc nhở bạn về sự cần thiết của người điều hành mới.

Nếu không, mã bên trong hàm tạo có thể sẽ giống với mã bạn viết bằng ngôn ngữ khác. Giá trị của this trong trường hợp này là đối tượng mới mà bạn đang tạo.

Quy tắc gọi hàm số 4: Khi gọi một hàm bằng toán tử mới, giá trị của this sẽ là một đối tượng mới được tạo bởi thời gian chạy JavaScript. Nếu hàm này không trả về bất kỳ đối tượng nào một cách rõ ràng thì đối tượng này sẽ được trả về ngầm.

Kết luận Hy vọng rằng, hiểu được sự khác biệt giữa các cách gọi hàm khác nhau sẽ giúp bạn cải thiện mã JavaScript của mình. Đôi khi các lỗi liên quan đến giá trị này rất khó phát hiện, vì vậy việc ngăn chặn chúng trước là điều hợp lý.

Ý tưởng tạo nội dung động trên tài nguyên web đã trở thành chuẩn mực. Các trang tĩnh và xây dựng trang web mẫu cuối cùng đã hoàn thành sứ mệnh của mình.

Tuy nhiên, tài nguyên web hiện đại không nhất thiết phải được thể hiện bằng một tập hợp các trang do máy chủ tạo ra và được trình duyệt cập nhật (JS+AJAX).

Khi khách truy cập đến, tài nguyên web có thể bao gồm một vài tiêu đề cho giao thức, một số văn bản ở phần “đầu”, một vài dòng mã trong phần “nội dung” và thế là xong. Phần còn lại" sẽ nảy ra một ý tưởng” trong quá trình trải nghiệm của du khách - đây là một địa điểm lý tưởng hoặc đang khao khát được như vậy.

Nơi mô tả và bản chất của chức năng

JavaScript là kinh nghiệm có được qua nhiều thập kỷ. Nó có một lịch sử phát triển đáng kể và một đội ngũ sáng tạo và phát triển hiện đại, có trình độ. Ngôn ngữ này được suy nghĩ kỹ lưỡng, đáng tin cậy, đẹp mắt và mang đến cho các nhà phát triển cơ hội thực sự để viết mã tốt và cải thiện bản thân.

Về nguyên tắc, khái niệm về thuật toán bên ngoài hàm không có ở đây. Tất nhiên, nhà phát triển có thể chèn tập lệnh vào bất kỳ đâu trên trang, đặt mã vào đó và nó sẽ được thực thi. Nhưng mục đích của mã chỉ được thực thi một lần là gì: khi trang được tải (tải lại)? Trừ khi có thể đặt giá trị ban đầu của một số biến không quan trọng.

Tập lệnh là nơi mô tả các biến và hàm cần thiết, chứ không phải là một đoạn mã hay được viết vì mục đích riêng của nó. Đó là tập hợp các chức năng thiết yếu và quan trọng, có lẽ là mối liên hệ trực tiếp lẫn nhau của chúng, nhưng thường thì mọi thứ đều khác nhau. Nơi mô tả chức năng và nơi áp dụng chức năng đó hoàn toàn không giống nhau.

Không nhất thiết một hàm sẽ gọi trực tiếp một hàm khác; nó có thể thực hiện điều này một cách gián tiếp thông qua việc tạo mã động. Khách truy cập đưa ra quyết định trong khuôn khổ mã này và một hệ thống chức năng hoàn toàn khác sẽ được kích hoạt.

Động lực học chức năng

Động lực chức năng không chỉ và không hẳn là các trình xử lý được gán cho các phần tử trang, chúng còn là các hàm hình thành nên các phần tử trang và các trình xử lý trực tiếp cũng có thể thay đổi.

Hành động trên trang diễn ra tùy thuộc vào các thành phần của nó và hành vi của khách truy cập trên đó. Chuyển động của chuột, nút bàn phím, nhấp chuột, sự kiện phần tử và các trường hợp khác dẫn đến việc khởi chạy các chức năng cần thiết.

Ban đầu không có trình tự và không có sự song song. Có phản hồi đầy đủ của tài nguyên web đối với các sự kiện. JavaScript sẽ thực hiện một chức năng cụ thể nhanh như thế nào tùy thuộc vào nhiều yếu tố kỹ thuật (máy tính, đường truyền thông) và ngữ nghĩa (logic thuật toán, lĩnh vực chủ đề, ý nghĩa của nhiệm vụ).

Trên thực tế, người ta có thể nói rằng điều gì đó diễn ra song song và điều gì đó sẽ được hoàn thành sau điều gì đó, nhưng điều này không có ý nghĩa cụ thể nào cả. Điều quan trọng là các hàm JavaScript cung cấp khả năng tạo phản hồi đầy đủ cho hành động của khách truy cập.

Đây là tư duy mới đang được phát triển: xử lý thông tin phân tán trong ruột của một trình duyệt!

Cú pháp của biến và hàm

Các biến JavaScript được đặt cả trong thẻ “script” và trong phần nội dung của hàm. Các hàm được định nghĩa theo cách tương tự. Không có điểm cụ thể nào khi viết một hàm khác bên trong một hàm, nhưng điều này có thể cần thiết vì nhiều lý do khác nhau và có cơ sở.

Mô tả hàm thường bắt đầu bằng từ khóa "hàm", theo sau là tên của nó, danh sách các đối số trong dấu ngoặc đơn được phân tách bằng dấu phẩy và nội dung hàm trong dấu ngoặc nhọn.

Ví dụ này mô tả hai hàm cung cấp khả năng trao đổi AJAX giữa trang và máy chủ. Biến scXHR được mô tả ở trên, do đó nó có sẵn cả trong InitXML và bên trong WaitReplySC.

Tên hàm và tham số "hàm"

Ở đây đã giới thiệu một tùy chọn không đồng bộ, trong đó hàm JavaScript trong hàm được gọi sau khi máy chủ phản hồi. Đồng thời, sau khi nhận được phản hồi từ máy chủ, WaitReplySC sẽ truy cập vào thẻ trang, điền thông tin nhận được vào chúng và gọi các chức năng khác có thể bắt đầu yêu cầu tiếp theo tới máy chủ.

Điều quan trọng cần lưu ý ở đây là WaitReplySC là một hàm. Nhưng trong dòng scXHR.onreadystatechange = WaitReplySC nó được truyền dưới dạng tham số. Đây là quy tắc chung để chuyển các hàm sang các hàm khác dưới dạng tham số. Chỉ định dấu ngoặc và chuyển (các) tham số của nó vào chúng - hàm sẽ được thực thi ngay lập tức. Anh ấy chỉ cho tôi tên của anh ấy, nhưng vậy thì sao. Cuộc gọi hàm sẽ được thực hiện bởi người nhận được tên của nó.

Chức năng được triển khai thông qua AJAX cho phép bạn thực hiện cuộc gọi đến chức năng JavaScript thông qua dữ liệu nhận được từ máy chủ. Trên thực tế, khi gửi yêu cầu đến máy chủ, một chức năng cụ thể có thể không “biết” nó đang truy cập vào chức năng nào và với thông tin gì.

Thoát hàm và kết quả của nó

Trong phần nội dung của hàm, bạn có thể viết bất kỳ toán tử nào của ngôn ngữ, trên thực tế, là nhằm mục đích này. Các biến được xác định bên trong và bên ngoài hàm có sẵn trong một hàm, nhưng không có các biến được xác định trong các hàm khác.

Nếu bạn muốn một hàm trả về kết quả, bạn có thể sử dụng câu lệnh return trong JavaScript: return. Có thể có đủ số lượng câu lệnh trả về trong thân hàm. Không nhất thiết tất cả chúng đều trả về cùng một loại kết quả.

Thông thường, các nhà phát triển rất tôn trọng tính năng này và tùy theo tình huống mà quyết định thoát khỏi tính năng này càng sớm càng tốt.

Không cần thiết phải xem hết toàn bộ thuật toán hàm khi bạn có thể thoát sớm hơn.

Đối số hàm

Các đối số của một hàm được truyền dưới dạng danh sách được phân tách bằng dấu phẩy, được đặt trong dấu ngoặc đơn và nằm ngay sau tên của nó. Tên biến được sử dụng làm đối số, nhưng các giá trị cũng có thể được truyền trực tiếp. Để truyền một hàm cho một hàm trong JavaScript, bạn chỉ cần chỉ định tên của nó mà không cần dấu ngoặc đơn.

Bên trong hàm có sẵn biến đối số có thuộc tính độ dài. Bạn có thể truy cập bất kỳ đối số nào của hàm thông qua các đối số, đối số, ... cho đến đối số cuối cùng.

Việc thay đổi đối số của hàm có hiệu lực bên trong hàm nhưng không hợp lệ bên ngoài hàm. Để thay đổi một cái gì đó bên ngoài hàm, bạn cần sử dụng toán tử trả về JavaScript, qua đó bạn chuyển giá trị được yêu cầu ra bên ngoài.

Sau khi hàm hoàn thành, mọi thứ liên quan đến việc thực thi nó sẽ bị hủy. Trong quá trình thực thi, một hàm có thể thay đổi các biến bên ngoài, ngoại trừ những biến được mô tả trong các hàm khác, bao gồm cả các biến bên trong.

đối số có thuộc tính callee, dùng để gọi một hàm đang được thực thi tại một thời điểm nhất định. Nếu bạn gọi chính nó, phiên bản JavaScript của một hàm trong hàm sẽ cho phép bạn triển khai đệ quy.

Sử dụng hàm

Mối quan tâm chính của các chức năng là phục vụ các sự kiện của trình duyệt. Để làm được điều này, trong hầu hết mọi thẻ đều có thể chỉ định tên của sự kiện và chức năng xử lý nó. Nhiều sự kiện có thể được chỉ định, nhưng chỉ một chức năng được chỉ định cho mỗi sự kiện.

Một hàm có thể phục vụ nhiều thành phần trang và nhiều sự kiện. Bằng cách sử dụng tham số “this”, bạn có thể chuyển thông tin đến hàm nơi nó được gọi.

Cách sử dụng cổ điển của các hàm JS là xử lý sự kiện trên các phần tử. Trong ví dụ này, hàm scfWecomeGo() hoặc scfWelcomeCancel() sẽ được gọi trong biểu mẫu đăng nhập/đăng xuất của khách truy cập và scfMenuItemClick(this) khi chọn chế độ vận hành.

Trong trường hợp sau, tham số “this” được chuyển, cho phép bạn tìm ra cuộc gọi đến từ div một cách kỳ diệu. Nói chung, JavaScript được nhúng rất tốt vào DOM và nó cho phép bạn điều hướng qua các phần tử của nó một cách thuận tiện và thu thập thông tin cần thiết đến mức động lực của trang có thể không thể đoán trước được.

Hàm không nhất thiết phải trả về một chuỗi ký tự, số hoặc hàm khác. Nó có thể trả về một phần tử HTML chính thức, chứa số lượng phần tử được yêu cầu, với các trình xử lý sự kiện riêng.

Bằng cách đặt một phần tử như vậy trên trang, nhà phát triển sẽ tạo ra chức năng mới, tốt về mặt giải quyết vấn đề và thỏa mãn lợi ích của khách truy cập, nhưng khá khó khăn về mặt triển khai.

Khi bắt đầu quá trình phát triển đầy đủ tính năng như vậy, bạn rất dễ bị nhầm lẫn trong mã của chính mình, trong các lệnh gọi hàm, tại thời điểm nội dung này hoặc nội dung kia của phần này hoặc phần kia của trang được hình thành. Trước khi đi theo hướng phát triển này, sẽ không có hại gì nếu bạn cân nhắc mọi thứ một cách cẩn thận.

Về tư duy phân tán

Nhà phát triển phải suy nghĩ ở cấp độ tất cả các thành phần trang, ở cấp độ tất cả các sự kiện và có ý tưởng rõ ràng về cách mọi thứ thực sự diễn ra. Thật khó khăn, nhưng công việc này rất đáng giá.

Trong JavaScript, việc thực thi một hàm có thể bị trì hoãn cho đến khi một số sự kiện xảy ra và có thể có nhiều hàm như vậy và các sự kiện có xu hướng lan truyền và rơi vào “phạm vi hiển thị” của nhiều trình xử lý khác nhau.

Trong ví dụ này, một hàm đã được gọi ở đâu đó trước đó để bắt đầu tạo một mục menu điều hướng tệp. Giả sử một tổ chức trang, nghĩa là chỉ có bảy tệp trong cửa sổ có thể bị xóa và xử lý. Bạn có thể điều hướng bằng cách nhấp vào một dòng của tệp, sử dụng mũi tên trên bàn phím hoặc theo khối bảy dòng.

Mỗi trường hợp có chức năng riêng của nó. Nói cách khác, trong một ví dụ đơn giản như vậy, cần phải viết vài chục hàm sẽ phản hồi với các sự kiện khác nhau và một số hàm này sẽ xử lý các tùy chọn và tình huống khác nhau hoàn toàn không liên quan đến các sự kiện.

Ví dụ: khi bạn xóa một hàng, những hàng phía dưới sẽ di chuyển lên trên. Để làm điều này, bạn sẽ cần phải thực hiện một lựa chọn mới, việc này đơn giản và tốn nhiều tài nguyên hoặc tính toán lại các dòng, sử dụng các hàm mảng trong javascript và đạt được mục tiêu một cách tao nhã.

Đối số và kết quả của hàm

JavaScript cho phép bạn đưa mã của mình về trạng thái "đầy đủ chức năng". Đối số của hàm là một hàm là điều bình thường. Một tùy chọn được cho phép khi hàm trả về một hàm. JavaScript hoàn toàn thoải mái về điều này.

Đây là cơ chế tốt nhưng khá phức tạp trong cách thực hiện. Về mặt kỹ thuật, mọi thứ đều được cho phép, chỉ có nhà phát triển đủ trình độ mới có thể cung cấp logic để chuyển “chức năng” về mặt ngữ nghĩa.

Khi trong JavaScript có một hàm trong một hàm, mọi thứ đều diễn ra tốt đẹp, nhưng khi một hàm tạo ra một hàm và hàm đó tạo ra một hàm khác, thì việc tuân theo logic là khá khó khăn. Về cơ bản, vấn đề không phải là áp dụng trình độ chuyên môn mà là vấn đề đạt được kết quả an toàn và chính xác.

Mối quan tâm của nhà phát triển là rõ ràng và đơn giản. Có vấn đề, bạn cần giải pháp chứ không phải lỗi như “Lỗi JavaScript, thao tác không an toàn”, màn hình trống hoặc dừng toàn bộ công cụ trình duyệt.

Nếu đối số là một hàm thì nhà phát triển sẽ truyền một biến có các thuộc tính đặc biệt, tức là biến đó không phải là số, không phải chuỗi, không phải đối tượng. Nhưng việc sử dụng đối số như vậy có thể dẫn đến việc thay đổi các biến bên ngoài và kết quả của hàm được thực thi. Tùy thuộc vào những gì được truyền đi, những thay đổi thích hợp sẽ được thực hiện.

Thực thi mã được tạo

Bạn có thể triển khai việc thực thi mã được tạo trong quá trình vận hành mã khác bằng cách sử dụng “eval”. Đây không được coi là một giải pháp tuyệt vời, nhưng thường thì bạn không thể làm phức tạp mã với các hàm không cần thiết mà chỉ giới hạn bản thân trong việc hình thành một dòng mã JavaScript tầm thường và chỉ cần thực thi nó.

Trong ví dụ này, một dòng được tạo để chèn một số thông tin vào div hiện tại. Số div và nội dung thông tin là khác nhau đối với các vị trí khác nhau, do đó, giải pháp như vậy trong tình huống này không đảm bảo cung cấp tình huống “lỗi javascript khi thao tác không an toàn”, nhưng nó chắc chắn sẽ mang lại hiệu quả mong muốn.

Một sắc thái của mô hình “hàm trong hàm” JavaScript

Nếu có cơ hội để làm mà không rườm rà, tốt hơn hết bạn nên tận dụng nó. Tất cả các tùy chọn được liệt kê đều tốt. Tất nhiên, trong nhiều trường hợp đây là giải pháp duy nhất.

Một ví dụ cổ điển về đệ quy: tính giai thừa. Rất khó để viết một thuật toán đi vào vòng lặp, nhưng lại rất dễ vượt ra ngoài ranh giới của giá trị. Giai thừa đang phát triển quá nhanh.

Tuy nhiên, cả đệ quy và một hàm gọi một hàm khác có thể thực hiện một cuộc gọi lại hợp lệ đều bình thường.

Ví dụ, một bảng thông thường. Có thể có các bảng khác trong bảng. Việc lồng nhau không thể bị giới hạn. Viết bộ hàm của riêng bạn cho mỗi bảng là điều quá xa xỉ.

Có thể đưa ra rất nhiều ví dụ như vậy và tất cả những ví dụ này sẽ là những nhiệm vụ thực tế và cấp bách, hoàn toàn không thuộc lĩnh vực lập trình. Đó là lý do tại sao vấn đề nằm chính xác ở chỗ không thể thực hiện được nếu không có sự rườm rà; hệ thống các chức năng được tạo ra, hay đúng hơn là việc gỡ lỗi và hoạt động đáng tin cậy sau đó của nó, trở thành mối quan tâm không phải của JavaScript mà của nhà phát triển.

Bài viết đang được phát triển!

Một bài viết trong đó chúng ta sẽ xem xét hàm là gì, cũng như phiên bản truyền thống (cổ điển) để làm việc với nó. Ngoài ra, chúng ta sẽ phân tích xem đối số (tham số) của hàm và toán tử trả về là gì.

một chức năng là gì?

Hàm là một tập hợp các lệnh có thể được đặt tên và sau đó được truy cập bằng tên đó từ bất kỳ đâu trong chương trình.

Một ví dụ cổ điển về việc sử dụng hàm. Có mã JavaScript trên một trang web, một số đoạn mã được lặp lại nhiều lần. Để tránh điều này, bạn có thể định dạng đoạn này dưới dạng một hàm, sau đó gọi nó ở những vị trí cần thiết trong mã bằng cách sử dụng tên của hàm này. Gọi hàm này có nghĩa là thực hiện các hướng dẫn có trong nó.

Làm cách nào để tổ chức thực hiện một số tác vụ trong JavaScript bằng các hàm? Để làm điều này bạn thường làm điều này:

  • chia nhiệm vụ thành các phần cấu thành của nó (nhiệm vụ con);
  • nhiệm vụ con được chính thức hóa thông qua các chức năng;
  • phát triển mã chính bằng cách sử dụng các lệnh gọi đến các hàm đã tạo.

Kết quả là, một chương trình như vậy trở nên có cấu trúc hơn. Việc thực hiện các thay đổi khác nhau và thêm các tính năng mới sẽ dễ dàng hơn.

Khai báo và gọi hàm

Các thao tác với một hàm trong JavaScript có thể được chia thành 2 bước:

  • khai báo (tạo) một hàm.
  • gọi (thực thi) chức năng này.

Khai báo hàm. Tạo một hàm trong JavaScript bắt đầu bằng việc viết từ khóa hàm, theo sau là tên của hàm, sau đó các tham số được liệt kê trong dấu ngoặc đơn, nếu cần, theo sau là các hướng dẫn được đặt trong dấu ngoặc nhọn.

// khai báo hàm someName function someName() ( Alert("Bạn đã gọi hàm someName!"); ) JavaScript - Cú pháp khai báo hàm

Các hàm loại này trong JavaScript được gọi là các câu lệnh khai báo hàm. Ngoài loại này, JavaScript còn phân biệt giữa biểu thức định nghĩa hàm và hàm biểu thức hàm mũi tên.

Tên hàm được tạo theo các quy tắc giống như tên biến. Những thứ kia. nó có thể chứa các chữ cái, số (0-9), dấu "$" và "_". Chỉ nên sử dụng các chữ cái trong bảng chữ cái tiếng Anh (a-z, A-Z) làm chữ cái. Tên hàm cũng giống như tên biến, không thể bắt đầu bằng số.

Một hàm có thể có nhiều tham số như mong muốn hoặc không có tham số nào cả. Dấu ngoặc đơn được bao gồm trong mọi trường hợp. Nếu có nhiều tham số thì chúng phải được phân tách bằng dấu phẩy. Các tham số chức năng được truy cập theo tên của chúng.

Một tập lệnh được đặt trong dấu ngoặc nhọn là mã hàm sẽ được thực thi khi nó được gọi.

Lời gọi hàm. Bản thân hàm được khai báo sẽ không được thực thi. Để chạy nó, nó phải được gọi. Một hàm được gọi bằng cách chỉ định tên của nó và hai dấu ngoặc đơn. Đối số được chỉ định bên trong dấu ngoặc đơn nếu cần thiết.

// gọi hàm trong ví dụ trước someName(); JavaScript - Cú pháp gọi hàm

Hàm có phải là đối tượng trong JavaScript không?

Các hàm trong JavaScript là các đối tượng. Trong JavaScript, mọi thứ đều là đối tượng ngoại trừ sáu kiểu dữ liệu nguyên thủy. Và nếu hàm là một đối tượng thì tham chiếu đến nó có thể được lưu trữ trong một biến.

// khai báo hàm someName function someName() ( Alert("Bạn đã gọi hàm someName!"); ) var reference = someName;

Sau này, bạn có thể gọi hàm như thế này:

Thẩm quyền giải quyết();

Tham số và đối số của hàm

Đối số của hàm là các giá trị được truyền cho một hàm khi nó được gọi. Các đối số được phân tách với nhau bằng dấu phẩy.

// gọi hàm sayWelcome truyền hai đối số cho nó sayWelcome("Ivan", "Ivanov"); // một lệnh gọi khác đến hàm sayWelcome với hai đối số sayWelcome("Petr", "Petrov");

Tham số hàm là một trong những cách trong JavaScript mà bạn có thể truy cập các đối số trong hàm. Các tham số của hàm ở giai đoạn khai báo được mô tả trong ngoặc đơn.

Nói cách khác, tham số hàm là các biến cục bộ được tạo tự động khi hàm được khởi chạy. Các tham số nhận dưới dạng giá trị mà các đối số tương ứng được truyền cho hàm trong quá trình gọi của nó. Bạn chỉ có thể truy cập các tham số bên trong hàm này; bên ngoài nó chúng không tồn tại.

// khai báo hàm sayWelcome, có hai tham số function sayWelcome (userFirstName, userLastName) ( // một lệnh hiển thị giá trị của tham số “userFirstName” và “userLastName” lên console console.log("Welcome, " + userLastName + " " + userFirstName ); )

Trong JavaScript, khi gọi một hàm, số lượng đối số không nhất thiết phải giống với số lượng tham số. Các tham số không được đặt thành giá trị khi được gọi sẽ bằng unfined .

Ví dụ: hãy gọi hàm từ ví dụ trên mà không chỉ định một hoặc hai tham số:

// gọi hàm sayWelcome và truyền một đối số cho nó sayWelcome("Peter"); // Chào mừng, chưa xác định Peter // gọi hàm sayWelcome mà không truyền bất kỳ đối số nào cho nó sayWelcome(); // Chào mừng, không xác định không xác định

Một ví dụ về hàm sẽ chỉ xuất các đối số được truyền cho nó tới bảng điều khiển trình duyệt:

// khai báo hàm function outParam(param1, param2, param3) ( console.log(param1 + "; " + param2 + "; " + param3); ) // gọi hàm outParam truyền cho nó một số tham số khác outParam( "Mưa" "Tuyết","Sương mù"); // Cơn mưa; Tuyết; Đầu ra sương mùParam(17); // 17; không xác định; đầu ra không xác địnhParam(24,33); // 24; 33; đầu ra không xác địnhParam(); // không xác định; không xác định; không xác định

Một cách khác để truy cập các đối số trong hàm là sử dụng đối tượng đối số đặc biệt. Các đối số được truy cập thông qua các đối số giống như các phần tử của một mảng thông thường, tức là. bằng số serial của chúng. Do đó, đối số - sẽ cho phép bạn lấy đối số đầu tiên, đối số - đối số thứ hai, v.v.

// khai báo hàm tổng hàm sum(num1, num2) ( /* num1 hoặc đối số – lấy giá trị của đối số 1 num2 hoặc đối số – lấy giá trị của đối số 2 */ var sum1 = num1 + num2, sum2 = đối số + đối số; return "Tổng, thu được theo phương pháp 1 bằng " + sum1 + "; tổng thu được theo phương pháp thứ 2 là " + sum2; ) /* xuất kết quả của hàm tổng ra bảng điều khiển 7 - đối số đầu tiên (nó có thể được truy cập bằng tên num1 hoặc sử dụng đối số) 4 - đối số thứ hai (nó có thể được truy cập bằng tên num2 hoặc sử dụng đối số) */ console.log(sum(7,4));

Sự khác biệt chính giữa các phương thức này là phương thức đầu tiên cho phép bạn chỉ truy cập những đối số đã được đặt tên ở giai đoạn khai báo hàm. Phương thức thứ hai cho phép bạn lấy giá trị của bất kỳ đối số nào, ngay cả khi nó không có tên (theo số sê-ri). Tính năng này của ngôn ngữ JavaScript cho phép bạn tạo các hàm phổ quát, linh hoạt.

Ngoài việc nhận các đối số, đối tượng đối số còn cho phép bạn biết số lượng của chúng. Điều này được thực hiện bằng cách sử dụng thuộc tính length.

Bạn có thể lặp lại các đối số được truyền cho hàm, chẳng hạn như sử dụng vòng lặp for hoặc for...of.

// khai báo hàm tổng hàm sum() ( var i = 0; console.log("Xuất ra tất cả các đối số bằng vòng lặp for"); for (i; i< arguments.length; i++) { console.log(i + 1 + " аргумент равен " + arguments[i]); } console.log("Вывод всех аргументов с помощью цикла for...of"); for (arg of arguments) { console.log(arg); } } // вызов функции sum sum(7, 4, 3, 1);

Một hàm hiển thị trên bảng điều khiển tất cả các đối số được truyền cho nó và số của chúng:

// khai báo hàm function myFunction () ( var i; console.log("Số tham số được truyền = " + đối số.length); // hãy xem qua tất cả các tham số bằng vòng lặp for for (i = 0; i< arguments.length; i++) { console.log(i + " параметр = " + arguments[i]); } } // вызовы функции myFunction myFunction(3, 7, 27, "JavaScript"); myFunction(); myFunction("Яблоки", "Груши", "Апельсины");

Một hàm thực hiện phép cộng tất cả các đối số được truyền cho nó (không xác định trước số lượng của chúng):

// khai báo hàm var myCalc = function() ( // hãy xem qua tất cả các tham số bằng vòng lặp for var i, sum = 0; for (i = 0; i lt; đối số.length; i++) ( sum += đối số [i] ; ) // trả về tổng dưới dạng kết quả return sum; ) // lệnh gọi hàm (xuất ra console) console.log(myCalc(4, 20, 17, -6));

Kết quả là, bằng cách sử dụng đối tượng đối số, bạn có thể triển khai các thao tác sau trong thân hàm:

  • kiểm tra số lượng đối số được thông qua;
  • xử lý bất kỳ số lượng tham số.

Ngoài chính hàm đó, các hàm khác nằm trong đó cũng có quyền truy cập vào các đối số được truyền cho nó ở giai đoạn gọi.

Hàm mainF(p1, p2) ( function childF() ( console.log("p1 = " + p1 + "; p2 = " + p2); ) childF(); ) mainF(3, 5); // p1 = 3; p2 = 5 mainF(4, 7); // p1 = 4; p2 = 7

Thiết lập mặc định

Bắt đầu với ECMAScript 2015 (6), tham số hàm có thể được đặt thành giá trị mặc định.

Ví dụ: hãy đặt tham số "color" thành giá trị mặc định của nó, bằng "#009688":

Hàm setBGColor(color = "#009688") ( document.body.style.backgroundColor = color; ) setBGColor(); // màu nền sẽ là #009688 setBGColor("red"); // màu nền sẽ là màu đỏ

Trước ECMAScript 2015, bạn có thể đặt tham số về giá trị mặc định, chẳng hạn như sau:

Hàm setBGColor(color) ( color = color !== không xác định ? color: "#009688"; // đặt màu thành giá trị mặc định của "#009688" document.body.style.backgroundColor = color; )

Các thông số còn lại

Nếu khi gọi một hàm, bạn truyền nhiều đối số cho nó hơn số tham số mà nó có, thì bạn có thể lấy những tham số còn lại bằng cách sử dụng cái gọi là thông số còn lại. Tính năng này đã xuất hiện trong ngôn ngữ kể từ ECMAScript 2015.

// ...nums - các tham số còn lại, có thể được truy cập trong trường hợp này bằng tên nums function doMath(mathAction, ...nums) ( var result = 0; nums.forEach(function(value) ( ​​​​switch ( mathAction) ( case "sum": result += value; break; case "sumCube": result += value**3; break; case "sumSquare": result += value**2; break; điếc: result = 0 ; ) ) ) trả về kết quả; ) console.log(doMath("sum", 3, 4, 21, -4)); // 24 (3 + 4 + 21 + (-4)) console.log(doMath("sumSquare", 1, 4)); // 17 (1^2 + 4^2) console.log(doMath("sumCube", 3, 2, 4)); // 99 (3^3 + 2^3 + 4^3)

tuyên bố trở lại

Câu lệnh return nhằm mục đích trả về giá trị hoặc kết quả đánh giá biểu thức của hàm hiện tại. Giá trị hoặc biểu thức phải được phân tách khỏi kết quả trả về bằng dấu cách. Ngoài ra, câu lệnh return dừng việc thực thi hàm, tức là. tất cả các hướng dẫn sau nó sẽ không được thực thi.

Một hàm trong JavaScript luôn trả về một kết quả, bất kể câu lệnh return có được sử dụng hay không.

// hàm trả về kết quả hàm sayWelcome (userFirstName, userLastName) ( if ((!userFirstName) || (!userLastName)) return "Chào mừng, người dùng ẩn danh"; nếu không thì trả về "Chào mừng, " + userLastName + " " + userFirstName ; ) // khai báo biến người var người; // gán kết quả của hàm sayWelcome cho biến người who = sayWelcome("Ivan","Ivanov"); // in giá trị của biến ra console console.log(person); // Lệnh sẽ xuất ra bảng điều khiển kết quả của hàm sayWelcome console.log(sayWelcome("Petr","Petrov")); // Lệnh sẽ xuất ra bảng điều khiển kết quả của hàm sayWelcome console.log(sayWelcome("Sidorov")); JavaScript - Hàm kiểm tra tham số

Một hàm trong JavaScript luôn trả về một kết quả do quá trình thực thi của nó, ngay cả khi nó không được xác định rõ ràng bằng câu lệnh return. Kết quả này không được xác định.

// 1. hàm không trả về bất kỳ kết quả nào hàm sayWelcome (userFirstName, userLastName) ( console.log("Welcome, " + userLastName + " " + userFirstName); ) // hãy thử lấy kết quả từ một hàm trả về không trả lại bất kỳ thứ gì console .log(sayWelcome("Ivan", "Ivanov")); // 2. hàm chứa câu lệnh return không có giá trị hàm sayDay (day) ( day = "Today," + day; return; // lệnh này sẽ không được thực thi vì nó xuất hiện sau câu lệnh return console.log(day) ; ) // hãy thử lấy kết quả từ một hàm chứa câu lệnh return không có giá trị console.log(sayDay("February 21, 2016")); JavaScript - Nhận giá trị từ một hàm không trả về gì

Kết quả tương tự sẽ thu được nếu câu lệnh return không chỉ định giá trị trả về.

Nạp chồng hàm trong JavaScript

Nạp chồng hàm trong lập trình là khả năng khai báo một số hàm có cùng tên trong cùng một phạm vi. Các hàm như vậy khác nhau về loại và số lượng đối số. Mỗi chức năng có logic chương trình riêng. Nạp chồng hàm được sử dụng để có thể thực hiện các hành động tương tự bằng cách sử dụng một tên hàm duy nhất.

Ngôn ngữ JavaScript không hỗ trợ nạp chồng hàm giống như cách nó được triển khai, chẳng hạn như trong các ngôn ngữ giống C. Những thứ kia. Trong JavaScript, bạn không thể tạo nhiều hàm có cùng tên trong cùng một phạm vi.

Chức năng tương tự có thể được triển khai trong JavaScript bằng các bước sau:

  • Để kiểm tra xem một đối số có được truyền hay không, hãy sử dụng điều kiện kiểm tra giá trị của nó cho unfined .
  • Để kiểm tra số lượng đối số được truyền cho một hàm, hãy sử dụng thuộc tính độ dài đối số của đối tượng.
  • Để tìm ra loại giá trị đối số được truyền, hãy sử dụng toán tử typeof hoặc instanceof.
  • Để làm việc với số lượng đối số thay đổi, hãy sử dụng đối tượng đối số.
  • Bắt đầu với ECMAScript6, bạn có thể chỉ định các giá trị mặc định cho các đối số.

Ví dụ: hãy tạo một hàm có thể được gọi bằng một hoặc hai đối số:

//khai báo hàm thay đổi màu nền của các phần tử function setBgColor(bgColor,elements) ( //nếu tham số phần tử không được chỉ định khi gọi if (elements=== unfined) ( //sau đó đặt giá trị của nó thành "div " Elements = "div "; ) //lấy tất cả các phần tử Elements = $(elements); // lặp lại tất cả các phần tử và đặt chúng thành các phần tử màu nền được chỉ định.each(function())( $(this).css(" Background-color",bgColor) ; )); ) /*Gọi hàm setBgColor, chỉ định một tham số. Bởi vì 2 không được chỉ định thì hàm này sẽ thay đổi màu nền của tất cả các phần tử div.*/ setBgColor("green"); /*Gọi hàm setBgColor, chỉ định 2 tham số. Bởi vì 2 được chỉ định, thì chức năng này sẽ chỉ thay đổi màu nền của các thành phần nút.*/ setBgColor("#ff0000","button");

Hãy thực hiện một số thay đổi đối với đoạn mã trên. Cụ thể, chúng tôi chỉ định giá trị mặc định cho tham số thứ hai:

// khai báo hàm thay đổi màu nền của các phần tử // tham số phần tử có giá trị "div" theo mặc định function setBgColor(bgColor,elements = "div") ( //lấy tất cả các phần tử Elements = $(elements); // lặp lại tất cả các phần tử và đặt chúng thành các phần tử màu nền được chỉ định.each(function())( $(this).css("background-color",bgColor); )); ) //gọi hàm setBgColor, chỉ định một tham số setBgColor("green" ); //gọi hàm setBgColor, chỉ định 2 tham số setBgColor("#ff0000","button");

Một ví dụ về cách trong JavaScript bạn có thể triển khai hàm "quá tải" để tính toán số lượng calo mà một người cần mỗi ngày:

// mô tả hàm function countCal(sex, chiều cao) ( // tham số: sex (sex) và chiều cao (height) var result; if ((sex === 0) || (sex === "man") ) ( result = (height - 100) * 20; ) else if ((sex === 1) || (sex === "phụ nữ")) ( result = (height - 105) * 19; ) if (kết quả ) ( // đối số - mức hoạt động if (đối số) ( result *= đối số; ) console.log("Lượng kcal cho cuộc sống bình thường: " + result); ) else ( console.log("Tham số không hợp lệ"); ) ) / * gọi một hàm và truyền 2 đối số cho nó (1 - "man", nó có thể được truy cập bằng tên sex và các đối số; 2 - giá trị 185, nó có thể được truy cập bằng tên sex và các đối số) */ countCal ("người đàn ông", 185); /* gọi một hàm và truyền 3 tham số cho nó, mặc dù chỉ có 2 tham số trong mô tả hàm (trong trường hợp này, bạn chỉ có thể lấy giá trị của tham số thứ 3 làm đối số) */ countCal(0, 185, 2);

đệ quy

Đệ quy là lệnh gọi đến chính nó trong phần thân của một hàm nào đó.

Một hàm thường được gọi tùy thuộc vào cách nó được khai báo theo tên hoặc theo một biến chứa tham chiếu đến hàm.

Hàm Fact(n) ( if (n === 1) ( return 1; ) return Fact(n-1) * n; ) console.log(fact(5)); // 120

Bạn có thể gọi một hàm bên trong phần thân của nó không chỉ bằng tên mà còn bằng cách sử dụng thuộc tính callee của đối tượng đối số. Nhưng tốt hơn hết là không nên sử dụng thuộc tính này, vì... nó đã lỗi thời. Ngoài ra, ở chế độ nghiêm ngặt, nó hoàn toàn không hoạt động.

Chức năng tích hợp (tiêu chuẩn) là gì?

JavaScript có một tập hợp rất lớn các hàm tích hợp (tiêu chuẩn). Các chức năng này đã được mô tả trong chính công cụ trình duyệt. Hầu như tất cả chúng đều là phương thức của đối tượng này hay đối tượng khác.

Ví dụ: để gọi cảnh báo hàm (phương thức) tích hợp, nó không cần phải khai báo trước. Nó đã được mô tả trong trình duyệt. Phương thức cảnh báo được gọi bằng cách chỉ định tên, dấu ngoặc đơn và đối số bên trong chúng. Phương pháp này được thiết kế để hiển thị thông báo trên màn hình dưới dạng hộp thoại. Tin nhắn văn bản được lấy từ giá trị tham số của hàm này.

// gọi hàm cảnh báo notification("Some text"); JavaScript - Gọi hàm cảnh báo