关于函数执行过程的一点思考

  刚刚有一个同学问我下面的代码出现了什么问题? 大家可以一起看看,这是初学者非常容易犯的错误。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<form action="" method="post">
	<input type="text" id="ccs"  >
	<input type="button" onclick="valll()" value="确定">
	</form>
	<p id="c1"></p>
	<script type="text/javascript">
	var username=document.getElementById("ccs").value;
	var c2=document.getElementById("c1");
	function valll(){
		if(username){
			c2.innerHTML=username;
		}else{
			c2.innerHTML="没有输入";
		}
	}
	</script>
</body>
</html>

  这个同学的本意是通过此代码实现这样的一个功能:当我们在输入框中如果输入了内容,那么p标签中会显示相应的内容,如果没有输入,那么则显示“没有输入”。可是最终输入与否都只会显示“没有输入”,这是为什么呢?

  其实很简单,当页面加载结束之后(实际上在JavaScript函数外部应该加上window.onload事件),前面两个声明语句只执行了一次,而每次调用函数不会在执行前面两个声明语句,于是username的值始终是空的,我们始终得不到正确结果。改进如下:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<form action="" method="post">
	<input type="text" id="ccs">
	<input type="button" onclick="valll()" value="确定">
	</form>
	<p id="c1"></p>
	<script type="text/javascript">
	var username=document.getElementById("ccs");
	var c2=document.getElementById("c1");
	function valll(){
		if(username.value){
			c2.innerHTML=username.value;
		}else{
			c2.innerHTML="没有输入";
		}
	}
	</script>
</body>
</html>

  这样,每次在调用valll函数时,都会获得当前id为ccs中的值,结果就是正确的了。

时间: 2024-10-08 08:15:52

关于函数执行过程的一点思考的相关文章

函数可重入问题reentrant functions(函数执行过程中可以被中断,允许多个副本)

最近经常听到这个名词,以前也听到过,不过接触更多的是“线程安全问题”,而且本人也一直理解的是两个名字的含义是一样的.今天仔细总结一下这个名词相关的概念. 引用博文:可重入函数和不可重入函数 (http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html) 主要用于多任务环境中, 一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误

Generator生成器函数执行过程的理解

一个最基本的Generator函数格式如下,函数体内部要使用yield修饰符则必须在函数名前加上*号 let y = 0; function *testYield(x){ console.log('before yield') y = yield x + 1; console.log('after yield') return y; } 结合此函数的调用代码如下,调用testYield(1) 并赋值给变量g时, 函数体内的任何语句并没有执行,只是生成了一个迭代器赋值给变量g let g = te

加法运算符重载为从成员函数执行过程

今天学习了运算符重载函数,测试了复数类加减运算符的重载,不明白运算符重载函数的执行过程,重点探究一下: 首先贴出源代码 // example_1_2_cl_dt_fushujiajian.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespace std; class complex { public: complex(double r=0.0,double i=0.0){re

对于函数名本质的一点思考

自己在学习函数指针的时候对函数名的意义产生了一点疑惑,经过一些尝试和思考,感觉应该可以像下面这样理解,如果有啥不对的希望大家指正. 首先 我们对变量名的定义做一下回顾: 在C语言里面,我们声明一个变量的时候就会给这个变量名分配一个内存空间,也就是说变量名和内存空间相对应:同时每个内存空间都会有个地址. int a; a=5; 上面两句话说明了:变量a对应的内存空间存储了一个整型数5,并且我们还可以知道这个内存空间的地址是&a. 对于函数的调用我们一般是直接用函数名的,但是在汇编语言里面,调用函数

引用作为函数返回值的一点思考

本篇文章的关注点是引用作为函数返回值,网上类似很多,具体可参考引用作为函数返回值的优缺点.这里,我想写下自己的想法. 在C++中,引用变量必须要初始化,否则会有编译错误.这里指的初始化,一般变量赋值初始化.如果是通过函数返回值来初始化,那就要好好考虑下. 以获取字体信息场景为例子:在启动时,通过读取字体配置文件来获得字体信息,保存在m_vLogFont.外部通过GetFont接口函数来获得字体信息,每一个Id对于一种字体,接口函数大致实现如下: const LOGFONT& GetFont(in

函数的执行过程——按值传递

上一篇博客我大概介绍了函数的由来和函数的执行过程,接下来,我要说明一下函数在执行的时候参数的传递方式--按值传递. 首先先用C++给大家写个函数,这个函数的功能是比较两个数的大小.然后函数参数在栈中的传递过程我会给大家贴张图. <span style="font-family:KaiTi_GB2312;font-size:18px;">#include<iostream> using namespace std; int max(int x ,int y) {

python函数得执行过程

对于 Python 常规函数,都只有一个入口,但会有多个出口如 return 返回或者抛出异常.函数从入口进入会一直运行到 return 语句或者抛出异常,中间不会暂停,函数一直拥有控制权.当运行结束,才将控制权还给调用者. 前文介绍过,当执行 Python 代码时,会先将代码编译成字节码,然后在虚拟机中解释执行字节码,编译好的字节码会保存在 .pyc 或 .pyd 扩展名的文件里.在运行时,虚拟机会创建字节码执行的上下文环境,Python 模拟 C 语言中的运行栈作为运行时的环境,使用PyFr

存储函数和过程

1 ORACLE提供可以把PL/SQL 程序存储在数据库中,并可以在任何地方运行它.这样就叫存储过程或函数.过程和函数统称为PL/SQL子程序,他们是被命名的PL/SQL块,均存储在数据库中,并通过输出,输出参数或输入/输出参数与其调用者交换信息.过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据. 2 --存储函数大致格式 create or replace function func_name(dept_id number,salary number) return numbe

进程的切换与系统的一般执行过程

进程的调度时机与进程的切换 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程,选择的过程中运用了不同的策略而已. 对于理解操作系统的工作机制,反而是进程的调度时机与进程的切换机制更为关键. 进程调度的时机 中断处理过程(包括时钟中断.I/O中断.系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule(): 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度