立即调用函数

  • 立即执行函数前面加分号是个好习惯,像这样子(function(){alert(1)})()的函数,如果js不换行,或者经过了压缩,很容易会使前后文重叠混乱。
  • 函数调用的两种方式,通过函数名调用,通过表达式调用。匿名函数调用算在表达式调用的方法里。
  • 而“function f(){}(1)”就是合法的,
    这个语句可以解读为两部分,第一部分还是function f(){}的函数声明,第二部分是(1)这个表达式;所以,函数没有被调用,运行结果为

    function f(){alert("fff")}(1)
    //1
  • “function f(){}”归约为FunctionDeclaration,
    “(1)”可以归约为Expression,视为括号运算符,或称为分组运算符。
  • 函数声明时必须有函数名
  • 构造函数并赋值

    var abc = new Function("x","y","return x*y;");
     alert(abc(2,3)); // "6"

    alert((function(x,y){return x+y;})(2,3));// "5"  
    alert((new Function("x","y","return x*y;"))(2,3));// "6"

  • 小括号能把表达式组合分块,并且每一块,也就是每一对小括号,都有一个返回值。这个返回值实际上也就是小括号中表达式的返回值。所以,当我们用一对小括号把匿名函数括起来的时候,实际上小括号对返回的,就是一个匿名函数的Function对象。因此,小括号对加上匿名函数就如同有名字的函数般被我们取得它的引用位置了。所以如果在这个引用变量后面再加上参数列表,就会实现普通函数的调用形式。
  • (function(){alert(1)})()应该是与a=function(){alert(1)}()等价,不能连a=都去掉。
  • 所以如果问你那个开篇中的jQuery代码片段是应用了JS里的什么特性?那么它只是匿名函数与匿名函数的调用而已。但是,它隐含了闭包的特性,并且随时可以实现闭包应用。因为JS天生就是有这个特性的!
  • 闭包容易造成内存泄漏,闭包导致内部变量被外面引用,得不到释放
  • 使用严格模式时,建议按一个个函数去开启严格模式(至少在学习的过渡期要这样做)
  • function strict()
    {
      // 函数级别严格模式语法
      ‘use strict‘;
      function nested() { return "And so am I!"; }
      return "Hi!  I‘m a strict mode function!  " + nested();
    }
    function notStrict() { return "I‘m not strict."; }
  • void function(){alert(2)} //undefined
    void function(){alert(2)}(); 可以调用
    new function(){alert(2)}();可以调用
    new function(){alert(2)}; 这里后面没跟括号,也可以调用。
    具体原因,在慢慢研究!!留个mark!
  • var nextId = function() { var id = 1 return function() { return id++ } },调用方式nextId();
    有些函数通常只会执行一次,比如进行初始化之类的工作。没必要浪费时间为它起一个可以复用的函数名
    var dd=function() {
    alert("hello, world.");
    } (); 在表达式后面加括号,可以调用
  • 现在,无论你定义一个函数像这样function foo(){}或者var foo = function(){},调用时,你都需要在后面加上一对圆括号,像这样foo()
  • JavaScript中()之间只能包含表达式(expression)由于把函数的声明写在了()之中,所以解释器以表达式(expression)来解析其中代码
  • foo相对于函数表达式`function(){/* code */}`只是一个引用变量
    
    var foo = function(){/* code */}
    function(){ /* code */}(); //SyntaxError: Unexpected token (
    
    遇到了这样的function关键字,默认的,它会将它当作是一个函数声明,而不是函数表达式,如果你不明确的告诉圆括号它是一个表达式,它会将其当作没有名字的函数声明并且抛出一个错误,因为函数声明需要一个名字。
    var foo = function(){console.log(1)}(),答案是可以的。
    //然而函数声明语法上是无效的,它仍然是一个声明,紧跟着的圆括号是无效的,因为圆括号里需要包含表达式。如果想要直接调用匿名函数,需要让js把它按照表达式来解析
    
    function foo(){ /* code */ }();//SyntaxError: Unexpected token
    
    //现在,你把一个表达式放在圆括号里,没有抛出错误...,但是函数也并没有执行,因为:
    
    function foo(){/* code */}(1)
    
    //它等同于如下,一个函数声明跟着一个完全没有关系的表达式:
    
    function foo(){/* code */}
    (1);
    当圆括号包裹函数时,它会默认将函数作为表达式去解析,而不是函数声明.
    (function(){/* code */}());//Crockford recommends this one,括号内的表达式代表函数立即调用表达式
    (function(){/* code */})();//But this one works just as well,括号内的表达式代表函数表达式
  • new function(){ alert("gg") } 会调用

  • 立即调用函数的一个优点,当这是一个非常长的函数表达式时,这可以节约比人阅读你代码的时间,不用滚到页面底部去看这个函数是否被调用。
  • 只要能让JavaScript解释器以「函数表达式」而不是「函数声明」来处理匿名函数的立即执行就可以了,把语句放在()之中只是其中的一种方法
  • // 如果本身就是expression,那么根本不需要做任何处理
    var i = function(){ return 10; }();
    true && function(){ /* code */ }();
    0, function(){ /* code */ }();
    
    // 如果你不在乎返回值,可以这么做
    !function(){ /* code */ }();
    ~function(){ /* code */ }();
    -function(){ /* code */ }();
    +function(){ /* code */ }();
    
    当圆括号出现在匿名函数的末尾想要调用函数时,它会默认将函数当成是函数声明。
    
    当圆括号包裹函数时,它会默认将函数作为表达式去解析,而不是函数声明。
时间: 2024-10-09 01:56:25

立即调用函数的相关文章

调用函数时传递的实参个数arguments.length; ,函数定义时的形参个数sum.length

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>范例6-4</title>

javascript学习笔记(二):定义函数、调用函数、参数、返回值、局部和全局变量

定义函数.调用函数.参数.返回值 关键字function定义函数,格式如下: function 函数名(){ 函数体 } 调用函数.参数.返回值的规则和c语言规则类似. 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta chaset="UTF-8"> 5 <title></title> 6 </head> 7 <body

Null作为参数的时候,Java编译器如何调用函数?

1 public class TestNull { 2 public void method(Object o){ 3 System.out.println("Object Version"); 4 } 5 6 public void method(String s){ 7 System.out.println("String Version"); 8 } 9 10 public static void main(String[] args) { 11 TestNu

调用函数的注意事项

在调用函数的时候一定要注意:1.实际参数的类型与形式参数的类型匹配. 2.实际参数与形式参数的个数要相同. 3.实际参数与形式参数的类型个数要一一对应. 我以注册与登录的程序为列来说明: package com.lovo.homework; import java.util.Scanner; public class Homework2016_11_22_1 { public static void main(String[] args) { String[] a=new String[3];

python学习日常-调用函数&amp;定义函数

这几天由于生病,所以停了下. 调用函数相当的简单,比其他许多语言简单多了.我们知道,python中有许多自带的方法,我们要用的时候,就直接“方法名(参数);"就可以调用了.比如调用类型转换方法将一个int类型转换为str类型就可以str(123):就好了 定义函数,一个函数简单的定义就是 关键字(def) 方法名(参数): 做什么: 比如定义一个a+b的方法 def Add(a,b): return a+b; 忘了说明,python函数一定有返回值,即return,你可以返回为none,但是还是

python获得线程调用函数的返回值

threading.Thread 并没有显式的提供获取线程调用函数返回值的方法,需求自己实现. 使用数据库是一个办法: 可以让子线程将数据写到数据库中,消费线程再去数据库中读取数据: 如果不想用数据库,可以使用类的全局变量来做传递, 示例代码如下: import os import threading class SubThread(): data = {} def __init__(self): ... def execute_func(self, key): # 执行各种操作 ... ret

通过函数实现打印*号组成的直角三角形,函数要求传入行数即可。在main 方法中,通过用户输入得到行数,然后调用函数做打印。

#include <stdio.h> /* 1.通过函数实现打印*号组成的直角三角形,函数要求传入行数即可.在main方法中,通过用户输入得到行数,然后调用函数做打印.三角形样式:********************* */ int sanjiao(int hang){ int i; int j; for(i = 0; i < hang;i++) { for(j = 0;j <i+1;j++) { printf("*"); } printf("\n

任意输入一个4位正整数,调用函数(函数自定义)输出该正整数数的各位数 字组成的最大数。

/*任意输入一个4位正整数,调用函数(函数自定义)输出该正整数数的各位数字组成的最大数.*/#include <stdio.h>int numb(int a){ int i = 0, j = 0,sum = 0, b[4]; b[0] = a%10; b[1] = a/10%10; b[2] = a/100%10; b[3] = a/1000; for (i = 0 ;i < 4; i++) { for(j = 0;j < 3 - i; j++) { if(b[j] > b[

python 之调用函数

Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以直接从Python的官方网站查看文档: http://docs.python.org/3/library/functions.html#abs 也可以在交互式命令行通过help(abs)查看abs函数的帮助信息. 调用abs函数: >>> abs(100) 100 >>> abs(-20) 20 >>> abs(1

JavaScript中以构造函数的方式调用函数

转自:http://www.cnblogs.com/Saints/p/6012188.html 构造器函数(Constructor functions)的定义和任何其它函数一样,我们可以使用函数声明.函数表达式或者函数构造器(见以前的随笔)等方式来构造函数对象.函数构造器和其它函数的区别在与它们的调用方式不同. 要以构造函数的方式调用函数,只需要在调用时在函数名称前加new 关键字,比如:function whatsMyContext(){ return this; }; 调用:new what