Javascript的闭包,匿名函数,自动调用


在案例的基础上分析

验证文本框

在这里插入图片描述

HTML

<p id="help">Helpful notes will appear here</p>
<p>E-mail: <input type="text" id="email" name="email"></p>
<p>Name: <input type="text" id="name" name="name"></p>
<p>Age: <input type="text" id="age" name="age"></p>

Javascript

function showHelp(help) {
  document.getElementById('help').innerHTML = help;
}

function makeHelpCallback(help) {
  return function() {
    showHelp(help);
  };
}

function setupHelp() {
  var helpText = [
      {'id': 'email', 'help': 'Your e-mail address'},
      {'id': 'name', 'help': 'Your full name'},
      {'id': 'age', 'help': 'Your age (you must be over 16)'}
    ];

  for (var i = 0; i < helpText.length; i++) {
    var item = helpText[i];
    document.getElementById(item.id).onfocus = function() {
      showHelp(item.help);
    }
  }
}
setupHelp();

分析

var引起的赋值错误

var声明的全局变量,只会把循环的最后一项进行赋值,只会显示

  var item = helpText[i];
    document.getElementById(item.id).onfocus = function() {
      showHelp(item.help);
    }

最优的解决方案forEach(function(item){})

function showHelp(help) {
  document.getElementById('help').textContent = help;
}

function setupHelp() {
  var helpText = [
    { id: 'email', help: 'Your e-mail address' },
    { id: 'name', help: 'Your full name' },
    { id: 'age', help: 'Your age (you must be over 16)' },
  ];

  helpText.forEach(function (text) {
    document.getElementById(text.id).onfocus = function () {
      showHelp(text.help);
    };
  });
}

setupHelp();

最简单的方式,const/let 申明一个局部变量

  for (var i = 0; i < helpText.length; i++) {
    let item = helpText[i];
    document.getElementById(item.id).onfocus = function() {
      showHelp(item.help);
    }
  }

直接使用函数

function makeHelpCallback(help) {
  return function() {
    showHelp(help);
  };
}

document.getElementById(item.id).onfocus = makeHelpCallback(item.help);

通过声明函数变量的方式定义函数

var makeHelpCallback = function(help){
  return function() {
    showHelp(help);
  };
}

document.getElementById(item.id).onfocus = makeHelpCallback(item.help);

申明匿名函数和自动调用函数的区别

  1. 每一次循环,把函数的引用进行赋值

    document.getElementById(item.id).onfocus = function() {
    showHelp(item.help)
    }

  2. (function())() 自动调用函数只会初始化一次,整个模块公用,所以在循环中不要用 ()()
    document.getElementById(item.id).onfocus =(function() {
    showHelp(item.help)
    })()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值