Home Web Front-end JS Tutorial JavaScript strange arguments analysis_javascript skills

JavaScript strange arguments analysis_javascript skills

May 16, 2016 pm 06:18 PM

In each function, there is a variable named arguments, which stores the parameters of the current call in an array-like form. And it is not actually an array. Trying to use the typeof arguments statement will return "object" (object), so it cannot use methods such as push and pop like Array. Even so, its value can still be obtained using the subscript and the length attribute.

Writing flexible functions
Although it may seem unknown, arguments are indeed very useful objects. For example, you can have a function handle a variable number of arguments. In the base2 library written by Dean Edwards, there is a function called format that takes full advantage of this feature:

Copy code The code is as follows :

function format(string) {
var args = arguments;
var pattern = new RegExp("%([1-" arguments.length "])", "g ");
return String(string).replace(pattern, function(match, index) {
return args[index];
});
};

This function implements template replacement. You can use %1 to %9 tags in the places you want to dynamically replace, and then the remaining parameters will replace these places in sequence. For example:

format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear"); The above script will return

"And the papers want to know whose shirt you wear" . What needs to be noted here is that even in the format function definition, we only define a parameter named string. Javascript allows us to pass any number of parameters to a function, regardless of the number of parameters defined by the function itself, and save these parameter values ​​​​in the arguments object of the called function.

Convert to an actual array
Although the arguments object is not a Javascript array in the true sense, we can use the slice method of the array to convert it into an array, similar to the following code
Copy code The code is as follows:

var args = Array.prototype.slice.call(arguments);

In this way, the array variable args contains the values ​​contained in all arguments objects.

Create a function with preset parameters
Using the arguments object can reduce the amount of Javascript code we write. Below is a function called makeFunc that returns an anonymous function based on the function name you provide and any number of other parameters. When this anonymous function is called, the parameters of the original call are merged and passed to the specified function to run and then return its return value.
Copy code The code is as follows:

function makeFunc() {
var args = Array .prototype.slice.call(arguments);
var func = args.shift();
return function() {
return func.apply(null, args.concat(Array.prototype.slice. call(arguments)));
};
}

The first parameter of makeFunc specifies the name of the function that needs to be called (yes, there is no error checking in this simple example ), and delete it from args after retrieval. makeFunc returns an anonymous function that calls the specified function using the Function Object's apply method.

The first parameter of the apply method specifies the scope. Basically the scope is the called function. But that looks a bit complicated in this example, so we set it to null ; its second parameter is an array that specifies the parameters of the function it calls. makeFunc converts its own arguments and concatenates the arguments of the anonymous function before passing them to the called function.

There is a situation where the output template is always the same. In order to save using the format function mentioned above and specifying repeated parameters each time, we can use the makeFunc tool. It will return an anonymous function and automatically generate the content after the specified template:
Copy code The code is as follows:

var majorTom = makeFunc(format, "This is Major Tom to ground control. I'm %1.");

You can repeatedly specify the majorTom function like this:
Copy code The code is as follows:

majorTom("stepping through the door");
majorTom ("floating in a most peculiar way");

Then every time the majorTom function is called, it will fill in the specified template with the first specified parameter. For example, the above code returns:
Copy the code The code is as follows:

"This is Major Tom to ground control. I'm stepping through the door."
"This is Major Tom to ground control. I'm floating in a most peculiar way."

Self-referential function
You may think this is cool, but don’t be too happy just yet, there will be a bigger surprise later. It (arguments) has another very useful attribute: callee. arguments.callee contains the referenced object of the currently called function. So what do we do with this thing? arguments.callee is a very useful anonymous function that calls itself.

There is a function named repeat below, whose parameters require a function reference and two numbers. The first number represents the number of runs, while the second function defines the time in milliseconds between runs. The following is the relevant code:
Copy code The code is as follows:

function repeat(fn, times , delay) {
return function() {
if(times-- > 0) {
fn.apply(null, arguments);
var args = Array.prototype.slice.call (arguments);
var self = arguments.callee;
setTimeout(function(){self.apply(null,args)}, delay);
}
};
}

The repeat function uses arguments.callee to obtain the current reference, saves it to the self variable, and then returns an anonymous function to re-run the originally called function. Finally, use setTimeout and an anonymous function to implement delayed execution.

As a simple explanation, for example, in a normal script, write the following simple function that provides a string and pops up a warning box:
Copy code The code is as follows:

function comms(s) {
alert(s);
}

Well, then I changed my mind. I want to write a "special version" of the function that will run three times with two seconds between each time. Then using my repeat function, you can do it like this:
Copy the code The code is as follows:

var somethingWrong = repeat(comms, 3, 2000);
somethingWrong("Can you hear me, major tom?");

The result is as expected, popping up three times The warning box is delayed for two seconds each time.

Finally, even if arguments are not used often and may even seem a bit weird, its above-mentioned amazing functions (and not just these!) are worth getting to know.
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What should I do if I encounter garbled code printing for front-end thermal paper receipts? What should I do if I encounter garbled code printing for front-end thermal paper receipts? Apr 04, 2025 pm 02:42 PM

Frequently Asked Questions and Solutions for Front-end Thermal Paper Ticket Printing In Front-end Development, Ticket Printing is a common requirement. However, many developers are implementing...

Demystifying JavaScript: What It Does and Why It Matters Demystifying JavaScript: What It Does and Why It Matters Apr 09, 2025 am 12:07 AM

JavaScript is the cornerstone of modern web development, and its main functions include event-driven programming, dynamic content generation and asynchronous programming. 1) Event-driven programming allows web pages to change dynamically according to user operations. 2) Dynamic content generation allows page content to be adjusted according to conditions. 3) Asynchronous programming ensures that the user interface is not blocked. JavaScript is widely used in web interaction, single-page application and server-side development, greatly improving the flexibility of user experience and cross-platform development.

Who gets paid more Python or JavaScript? Who gets paid more Python or JavaScript? Apr 04, 2025 am 12:09 AM

There is no absolute salary for Python and JavaScript developers, depending on skills and industry needs. 1. Python may be paid more in data science and machine learning. 2. JavaScript has great demand in front-end and full-stack development, and its salary is also considerable. 3. Influencing factors include experience, geographical location, company size and specific skills.

How to merge array elements with the same ID into one object using JavaScript? How to merge array elements with the same ID into one object using JavaScript? Apr 04, 2025 pm 05:09 PM

How to merge array elements with the same ID into one object in JavaScript? When processing data, we often encounter the need to have the same ID...

Is JavaScript hard to learn? Is JavaScript hard to learn? Apr 03, 2025 am 12:20 AM

Learning JavaScript is not difficult, but it is challenging. 1) Understand basic concepts such as variables, data types, functions, etc. 2) Master asynchronous programming and implement it through event loops. 3) Use DOM operations and Promise to handle asynchronous requests. 4) Avoid common mistakes and use debugging techniques. 5) Optimize performance and follow best practices.

How to achieve parallax scrolling and element animation effects, like Shiseido's official website?
or:
How can we achieve the animation effect accompanied by page scrolling like Shiseido's official website? How to achieve parallax scrolling and element animation effects, like Shiseido's official website? or: How can we achieve the animation effect accompanied by page scrolling like Shiseido's official website? Apr 04, 2025 pm 05:36 PM

Discussion on the realization of parallax scrolling and element animation effects in this article will explore how to achieve similar to Shiseido official website (https://www.shiseido.co.jp/sb/wonderland/)...

The Evolution of JavaScript: Current Trends and Future Prospects The Evolution of JavaScript: Current Trends and Future Prospects Apr 10, 2025 am 09:33 AM

The latest trends in JavaScript include the rise of TypeScript, the popularity of modern frameworks and libraries, and the application of WebAssembly. Future prospects cover more powerful type systems, the development of server-side JavaScript, the expansion of artificial intelligence and machine learning, and the potential of IoT and edge computing.

The difference in console.log output result: Why are the two calls different? The difference in console.log output result: Why are the two calls different? Apr 04, 2025 pm 05:12 PM

In-depth discussion of the root causes of the difference in console.log output. This article will analyze the differences in the output results of console.log function in a piece of code and explain the reasons behind it. �...

See all articles