函数和作用域

function  sum() {
console.log('hello')
console.log('饥人谷')
}
这是声明函数,调用就直接:
sum()

另一种声明方式:
var sum = function() {
console.log('hello')
console.log('饥人谷')
};
sum()

参数:
 function sum( a , b) {
console.log( a + b)
return a + b
};
sum( 3 ,4)
得到7。

 function sum( a , b ,c) {
console.log( a + b +c)
return a + b
};
sum( 3 ,4)
输出NaN,因为c是undefined。而且声明下,在控制台的输出的是console.log的执行的功能后展示的内容。
这里顺便联想了一下,console.log语句或表达式输出的内容是这个语句在控制台的一种功能作用的结果,它相当于控制台的一个工具,而这个表达式或语句本身的值是undefined。
而return的才是给读者的反馈。同时,return必须放到函数内部,只有在内部,才可以使参数有意义的。

function say( name,age) {
console.log( name + 'says: I am' +age +'years old')
}
say( '小哥',6)
’小哥says: I am  6 years old'

function say( name,age) {
console.log( name + 'says: I am' +age +'years old')
}
says( 6)
'6 says: I am  undefined years old'
6是name的值,剩下的undefined。

var result =sum( 4 ,6)
function sum(a ,b)  {
console.log(a + b)
}
console.log(result)
输出10,这里是console.log到调试里的显示结果,返回值是return的值。sum没有返回值,默认为undefined值。console.log(a)是运行显示了a,但是这句话本身的结果是undefined。

遇到return,后面就完全停了。
function fn( score){
if(score < 0){ 
return
}
console.log(score)
}
fn( -3 )
return 后面没有赋值,就是返回undefined的意思。
调用时,fn( -3 )
返回undefined,后面不执行了。
这个等同于——
function fn(score) {
if(score <0)  {

}else {
console.log(score)
}
}
fn(-3)

参数相关和arguments:
function printName () {
var name = arguments[0]
console.log(name)
}
printName('Byron')

还有一种写法——
function printName(name){
    console.log(name);
}
printName('Byron');
第二种是最直接的命名然后就可以用了,逻辑很简单的,第一种是把参数name值通过arguments传递了过来,如果这时候没有赋值,arguments值为undefined输出为undefined。


声明提前——
js文件都是顺序执行的哦。
变量的:
console.log(a)
console.log(b)
var a=3
执行的结果是a输出undefined不报错,b输出undefined报错了。
为什么?var a =3等同于——
var a   //这是声明,规则是放到所在区块的前端,然后再执行。
a = 3

也就是在浏览器逻辑解析下,就是这个样子执行:
var a
console.log(a)
console.log(b)
 a=3
这样就明白了吧,a现在已经声明了,但是执行console.log时,3的值还没生效,为undefined,当然把执行语句放到a=3后面执行,就可以了。
b又没声明,又没值。

函数的:

sum(3,5)
function sum(a ,b){
console.log( a + b)
}
这时候运行起来,得到8。甚至在sum和函数中间加点语句也会显示。这里要说,函数声明跟变量声明类似,在执行之前,把所有的变量声明和函数声明拿到执行语句的前面。
表达式的声明:
fn()
var  fn = function(){
console.log('haha')
}
运行报错了。为什么?
函数表达式的角度看,上面的代码等同于:
var  fn
fn()
fn = function(){
console.log('haha')
}
按顺序来,fn现在只是声明了,是undefined,而fn()是把fn当成函数了,所以报错了。

立刻执行的函数表达式——
(function(){
console.log('haha')
})()
输出"haha",小括号的优先级高,被认为是个值,一个值加(),被认为是函数。
相当于:
var fn = function(){
console.log('haha')
}
fn ()

命名冲突——

var fn = 3
function fn(){  }
console.log(fn)
等同于
var fn  //声明,fn is undefined
function fn(){ }  // fn赋予了函数声明,覆盖了undefined状态
fn = 3  //  3的值赋予到a,这个操作才是最终的结果
console.log(fn)  // 3

function fn(){  }
console.log(fn)
var fn = 3
等同于:
function fn(){  } //声明,fn不仅有了var fn的意义,更进一步添加了函数的内在身份
var fn   //声明 ,无所谓影响了,最
console.log(fn)   // function fn(){  }
 fn = 3  // 赋值

function fn(fn ){
console.log( fn )
var fn = 3
console.log( fn )
}
fn(10)
如果出现了参数与函数命名重复了怎么办?假设一个arguments[0]。
变成如此:
function fn( ){
var fn = arguments[0] //这时候把10赋予过来了
console.log( fn )  // 输出10
var fn = 3  //3覆盖掉10的值
console.log( fn )  //输出3
}
fn(10)  //10,3

这里就有些类似于我高考的数学变形题目了,fn(fn)跟fn(10)的关系就是得到了现在fn=10,回归到函数内部,就还有一个语句运行环境的观念,千万不要想当然,整个函数运行起来,fn=10适用于所有语句了。能说它嵌套吗?也不算。

递归函数——
function fn(n ){
if (n ==1){
return 1
}     // 限制n为1时的0或者出现负数
return n*fn(n-1)  //这是表达式
}
fn (4) //24,就是1*2*3*4
效率低,需要计算1,2,3,4,的,算4次,就是逻辑清晰简单而已。

作用域——————
{
var a = 3
}
console.log(a) //1,也没报错,直接写大括号没作用域

js里没有块级作用域。
循环:
for(var i =0; i<10; i++){
var a = 3
}
console.log(a) //3,这里的意思就是循环语句里的变量作用于全局的,也就是没有作用域,包括里面的i。当然循环语句会声明前置到代码顶部。
这里很容易混淆,因为重点就是讲函数的作用域的。
function fn(){
var a =1
if (a>2){
var b =3
}
console.log(b)
}
fn()//1<2,直接运行后面的console.log(b),b没声明,undefined
console.log(a)// 报错了,因为函数作用域,a是函数内部变量,全局里没有它。

这里的意思就是变量都是有作用区域的,声明区域多大,它的意义就发挥在多大空间,跟数学函数的自变量的范围差不多。函数内的变量只能有意义在这个函数内部,那全局变量对函数本身内部呢?

function fn(){
a = 2
}
fn()
console.log(a)//2,不写var去声明变量,就是全局的性质,外部可以用它了。所有以后声明变量一定要逻辑清晰,慎重。在最外层写全局的,能写var就写上。













最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容