函数使用的原因
函数是设计出来是为了完成某项功能的代码块。只要调用就能执行。实现代码复用。代码复用是不是复制,而是同样的代码不用写很多。只要用调用的代码来写,就能完成。将功能代码放到某个地方。函数的设计就是为了代码复用。
声明函数和调用函数
这一段功能代码首先是要声明的。声明之后调用可以执行内部功能代码块。实现代码复用。
function 函数名(形参名,形参名){
代码块
}
这里声明函数与java不同。这里就是只用function关键字。而且一定有返回值的。java是可以没有。但是不用写返回类型。因为返回类型不是let var const 最后返回的只是一个值。所以返回值类型肯定是数据类型。但是我们这JS弱类型语言。无论返回什么类型都能接收。因此不写返回值类型。是任意的。我们形参不写let var声明默认用let来声明。调用如果是自己的类内。或者是一个文件的Script都是相当于一个类内。可以直接调用。其他的类调用也和java一样有类名和对象调用。这里function代替public
调用函数时函数名(实参,实参)
函数名声明的规范
函数名命名规范 |
小驼峰命名,首字母小写,第二个单词开始首字母大写 |
前缀(首字母)一般为动词 |
与变量名一致,见名知意 |
函数传参
函数名内可以写形参,变量名,不用写let。默认是let。调用的时候在函数名括号内写实参,当调用的时候,会首先传参给对应的形参。形参会在函数体内命名。每当一次调用就会传参然后执行代码。传参就会创建变量。当执行代码就去访问当时的参数。执行结束。内存会释放。当再次执行又是一样。函数传参可以让用户控制是如何的功能。如果没参数。则只能自己在函数体内写。一定是不灵活的。只代表一个功能。参数之间用逗号隔开。函数参数分为形参和实参。函数和他有关的就是声明和调用。因此只这两种。
当 var a =1 var a 这种代码第二个代码没有作用的,不会赋值赋undefined,当它发现已经创建就不会创建。没写赋值操作就不会赋值,当不是创建。以及var a=1相当于在最上面写 var a 在原本的地方写 a=1如果有重名一定是找函数体的a。以及传参的时候可以在形参赋值,当执行的时候如果没有给实参,则会值是这个。赋值可以给【】都可以。如果是数组,需要【】要不报错了,函数传参如实参有些没给,则自动给参,给undefined。定义的时候给undefined这个值。如果也是没有默认的。
函数返回值
JS函数返回值写的是数据类型,因此不写返回值类型。但是一定是会返回的,没有void这种可以不不返回,return结束函数。且会返回值。如果没有返回值return 后面没写返回值/没写return。调用结束都会给undefined。写了这个返回值,执行到最后return/已经结束。结束会把return后面的值/undefined赋给调用整体。虽然不是变量。但是有值。如三目运算符。这个整体也和变量一样有值,可以赋给其他变量。如果没有返回值执行结束了,我们把实参给它,但是没有返回值的。结束就结束了。没办法再程序中得到值。想在什么时候使用就使用。即使里面给了某一个元素。也很麻烦。没办法给不是变量的,做其他运算。所以返回值可以有这种作用。让调用者如同三目运算符赋值,不是变量。因此没有地址。但是整体代表那个值。赋给变量。值给它。=一定是字面值。返回值可以写变量名,没事,因为执行的时候,会赋值,会计算出来给调用者。
断点
Fn+F11/F11
作用域
我懂了。如果是在全局变量那里写的。不是函数体内,是自调。但是对于函数体内写的let是创建在函数体内。当执行函数体/其他代码。我们执行的时候,如果访问变量,首先是从改变量所在作用域找。找不到才从包围这个作用域的作用域从小到大去找。全局是window对象/脚本对象。/写在script下的。找的时候,一定是从包围查找代码的作用域的作用域从小到大的找。去找作用域的变量。
变量创建
变量可以不写关键词来命名,但是不写关键词的都是相当于写了var 只要写了var都是全局变量。当没写关键词的就相当于写了var。但是不会有var a这种,只在执行那一句的时候,去找全局是否有,有则赋值,无则创建。变量名命名的时候只要是不同作用域范围内的变量名可一样,但是一个作用域的起名一定不同。作用域包围另一个可不是同一个作用域。我弄错了,var/let写在函数体的就地址在函数体内。
var!=全局变量
函数体内 | 函数体外 |
无论什么定义var/let.. ,最后都是在函数体内创建地址 | 写任何关键词都是脚本对象/window对象,都是全局变量 |
除非不写关键词,且不写关键词的时候,函数本身,没这个,不找自己的时候, 去找外部全局的时候,找不到会当成 var来创建地址。且不会有var a这种 ,只执行一句。找不到的时候,不报错,当成window上的变量创建。 | 在函数体外,不写也当成var。 |
匿名函数
一个函数它是可以没有函数名的。但是一个函数如果没有函数名一定要把它赋给一个变量。一个变量时可以被赋函数。无论是否是匿名函数。也可以是有函数名的函数。这个赋值了之后,把这个变量名(),会调用函数,无论是否对应函数名。变量可以给字面值也可以是函数。但是如果写的是匿名函数必须写let,否则无效,也会报错。且如果将函数给变量,函数代码存在变量地址内。调用不了无法用函数名。写在方法去按函数名调用。用函数名是在方法去找。
立即执行函数
有两种写法
( function(){}())或者(function(){})()
这两种都是立即执行函数。这种函数的特点就是不会加载到方法区,不存在被其他的调用。只能在这个()调用写的这个函数,当执行这个代码的时候,就执行,执行完了,这空间肯定会被释放。且不会再被调用。这个函数再也访问没办法调用。 立即执行函数前和立即执行函数语句都需要加;对于立即执行函数,换行不代表结束。对于其他换行代表结束。因此结束一个语句另一个就可以执行,不会报错。前面必须加,要不就会当成没结束。立即执行函数也可以访问全局等其他作用域。我们知道函数调用结束都可以有返回值,且返回值可以赋给调用者。如果函数给一个变量。返回值也会赋给调用者。变量名()。这里调用者是整体。因此这个整体会是return的值。
立即执行函数如何防止变量污染呢?
变量污染是针对全局变量可能会产生一样的变量名,无论var/let都会产生错误。因此我们把变量放到局部函数内写。不同的作用域不会有全局变量名相同。但是局部变量自己注意也不能同。其实只要是函数就能实现防止变量污染。我们函数只执行一次就用立即执行,否则我们不用这个,实现多次。如果用立即函数且实现多次,没办法调用。需要些多端重复代码。代码复用可以只改一段实现多段改变。
逻辑中断
当我们执行逻辑与/逻辑或的时候,我们执行是从左往右执行,执行到能代表整体最后的值结束。我们执行的时候,只要一下子左/右转换成true,能决定这个整体的真假,就结束。将这个值给整体。执行逻辑与逻辑或整体的时候,这样写在右边的代码无法执行。逻辑与逻辑或左右都是可以写语句的。if等这些最后转换成布尔都是可以写语句。逻辑与,逻辑或也是可以写语句。不过最后的值是变量。我们可以用逻辑或写在形参上,形参在最上面写逻辑或,一定是写在右边的会不执行。中断,是从左往右。我们将没有赋值要给的值,写在右边。最后的值是执行到那一步。用逻辑或只要给了值,转成不是false。不会区执行右边。当没给值等就会执行右边,最后是右边的值。最后整体转成布尔是那个值还是看最后的值。看最后的值,在if内,隐式转成boolean。看整体的值的时候,是没有转换的。
隐式/显示Boolean()转换布尔最后的值只false/true。不像数字,数字最后是NaN和数字。
0 undefined nul nan ''都最后是false。一定是空字符串,写了空格,字符内也是有的。空格也是字符。得到的都是。return。
函数名相同
当定义函数名相同的。由于JS是弱类型语言,因此无法根据参数来方法重载。只能有一个函数名相同的函数。我们会先编译html文件,将函数放在方法区放的时候,后面的函数会代替前面的留在方法区。当执行的时候调用方法找的是方法区。所以调用方法可以在声明函数前。会先编译。函数名相同不报错。